Получение всех классов из текущей рабочей области в Eclipse - PullRequest
8 голосов
/ 17 июля 2010

пишу плагин 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;
}

Это, однако, похоже, не работает. У меня было несколько строк печати, и я понял, что он также включает в себя не относящиеся к делу классы (то есть классы из Java \ jre6 \ lib \ rt.jar). Есть предложения?

Ответы [ 4 ]

1 голос
/ 21 июля 2010

Я не уверен, что вы хотите сделать:

  • В работающем подключаемом модуле Eclipse показать все классы, работающие в JVM с подключаемым модулем (т.е. классы для других редакторов, представлений, механизмов Eclipse)?
  • В работающем плагине Eclipse показать все классы, создаваемые в открытых проектах Java в рабочей области? (Поскольку вы использовали слово «рабочее пространство», я подозреваю, что это то, что вы ищете.)

Обратите внимание, что в последнем случае вы не сможете получить реальные объекты Java Class<...>, поскольку редактируемые и компилируемые проекты не загружаются для выполнения в ту же JVM, что и ваш плагин. Код вашего плагина будет выполняться вместе с кодом Eclipse IDE и Eclipse JDT; единственные классы времени в открытых проектах, которые будут загружены для выполнения (где-то создаются объекты Class<...>), будут при запуске или отладке одного из этих проектов. , , в этом случае вы имеете дело с совершенно новой JVM, и ваш плагин больше не существует. Имеет ли это смысл?

Если я правильно вас читаю, думаю, вы, вероятно, захотите найти "единицы компиляции", а не "файлы классов". «Единицы компиляции» соответствуют исходным файлам .java, а «файлы классов» соответствуют предварительно созданным двоичным файлам классов (часто в JAR-файлах). Или, может быть, вам нужны оба. Более того, звучит так, будто вы действительно хотите, чтобы это были «типы» внутри них.

Обратитесь к Руководству по ядру JDT для получения довольно хорошей информации, которую удивительно трудно найти. Обратите внимание, что некоторый анализ возможен на уровне модели Java, но более детальный анализ (например, поиск «внутренних» определений методов) потребует анализа частей кода в AST и перехода оттуда. Модель Java довольно удобна в использовании, но материал AST может показаться немного сложным в первый раз.

Также рассмотрите поисковую систему Java (описанную выше) и IType.newTypeHierarchy() для поиска и навигации по типам.

Удачи!

1 голос
/ 09 сентября 2010

Вы должны попробовать:

for (final ICompilationUnit compilationUnit : packageFragment.getCompilationUnits()) {
       // now check if compilationUnit.exits
}

Вы не получаете CompilationUnit для двоичных типов.

0 голосов
/ 25 июня 2014

У меня есть гораздо более простое решение для проекта eclipse, если вы просто ищете список имен классов java для текущего пакета и добавляете их в список классов (замените PARENT_CLASS именем родительского класса всех ваших классов):

    List<PARENT_CLASS> arrayListOfClasses = new ArrayList<>();

    String currentDir  = new java.io.File("").toURI().toString().split("file:/")[1];
    System.out.println("currentDir=" + currentDir);
    String[] dirStringTab = currentDir.split("/");
    String currentPackageName = dirStringTab[dirStringTab.length-1];
    System.out.println("currentPackageName=" + currentPackageName);

    File dir = new File("./src/" + currentPackageName + "/");
    File[] filesList = dir.listFiles();
    String javaClassNameWithoutExtension = "";

    for (File file : filesList) {
        if (file.isFile()) {
            System.out.println(javaClassNameWithoutExtension);
            javaClassNameWithoutExtension = file.getName().split(".java")[0];

        Class c  = Class.forName(javaClassNameWithoutExtension); 
        Object a = c.newInstance();
        arrayListOfClasses.add(a);

        }
    }
0 голосов
/ 19 июля 2010

Может быть, вы можете использовать метод IJavaProject.getAllPackageFragmentRoots (), чтобы получить всю исходную папку, а затем получить ICompilationUnits в ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...