действительно ли запись является плагином Eclipse, и я пытался создать метод, который возвращает все классы в рабочей области в ArrayList <\Class <\?>> (я добавил "\" для включения универсальных скобок, так как HTML не позволит мне сделать так иначе).
Вот код, который я имею:
private ArrayList<Class<?>> getAllClasses() throws JavaModelException {
ArrayList<Class<?>> classList = new ArrayList<Class<?>>();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IProject[] projects = root.getProjects();
for (IProject project : projects) {
IJavaProject javaProject = JavaCore.create(project);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment myPackage : packages) {
IClassFile[] classes = myPackage.getClassFiles();
for (IClassFile myClass : classes) {
classList.add(myClass.getClass());
}
}
}
return classList;
}
Это, однако, кажется, не работает. У меня был некоторый printlines, и я выяснил, что он также включает несоответствующие классы (т.е. классы от Java\jre6\lib\rt.jar). Какие-либо предложения?
Возможно, вы можете использовать метод IJavaProject.getAllPackageFragmentRoots (), чтобы получить всю исходную папку, а затем получить в ней ICompilationUnits.
Я не уверен, что вы хотите сделать:
Обратите внимание, что в последнем случае вы не сможете получить реальные объекты Java Class<...>
, поскольку редактируемые и компилируемые проекты не загружаются для выполнения в ту же JVM, что и ваш плагин. Код вашего плагина будет выполняться вместе с кодом Eclipse IDE и Eclipse JDT; единственный раз, когда классы в открытых проектах будут загружены для выполнения (создавая Class<...>
объекты где-то), это когда вы запускаете или отлаживаете один из этих проектов ... в этом случае вы имеете дело с совершенно новой JVM, и вашего плагина больше нет. Имеет ли это смысл?
Если я правильно вас понял, то, вероятно, вы хотите найти "единицы компиляции", а не "файлы классов". "Единицы компиляции" соответствуют .java
исходным файлам, а "файлы классов" соответствуют предварительно созданным бинарным файлам классов (часто в JAR). А может быть, вам нужно и то, и другое. Еще лучше, если то, что вам действительно нужно, - это "типы" внутри этих файлов.
Посмотрите руководство по JDT Core для получения довольно хорошей информации, которую удивительно трудно найти. Обратите внимание, что некоторый анализ возможен на уровне модели Java, но более детальный анализ (например, поиск "внутри" определений методов) потребует разбора кусков кода в AST и перехода оттуда. Java Model довольно удобна в использовании, но AST может быть немного пугающей в первый раз.
Также рассмотрите поисковую систему Java (документированную рядом с вышеуказанной) и IType.newTypeHierarchy()
для поиска и навигации по типам.
Удачи!