从Eclipse中的当前工作空间获取所有类

时间:2010-07-17 19:49:43

标签: java eclipse plugins class

我正在编写一个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 个答案:

答案 0 :(得分:1)

我不确定你想做什么:

  • 在正在运行的Eclipse插件中,使用插件显示JVM中运行的所有类(即其他编辑器,视图,Eclipse机器的类)?
  • 在正在运行的Eclipse插件中,显示在工作区中的开放Java项目中构建的所有类? (由于你使用了“工作区”这个词,我怀疑这就是你要找的东西。)

注意在后一种情况下,您将无法获得实际的Java Class<...>对象,因为正在编辑和编译的项目不会被加载到与插件相同的JVM中。您的插件代码将与Eclipse IDE和Eclipse JDT工具代码一起执行;只有在启动或调试其中一个项目时,才会加载打开项目中的类以执行(在某处生成Class<...>个对象)。 。 。在这种情况下,您正在处理一个全新的JVM,而您的插件已不再存在。这有意义吗?

如果我正确地读你,我想你可能想找到“编译单元”,而不是“类文件”。 “编译单元”对应于.java源文件,而“类文件”对应于预先构建的二进制类文件(通常在JAR中)。或许你需要两者兼得。更好的是,听起来你真正想要的是那些内部的“类型”。

查看JDT Core guide以获取一些非常难以找到的非常好的信息。请注意,在Java Model级别可以进行一些分析,但更详细的分析(例如,查看“内部”方法定义)将需要将代码块解析为AST并从那里开始。 Java模型使用非常方便,但AST的东西在第一次出现时会有点令人生畏。

还要考虑Java搜索引擎(在上面附近记录)和IType.newTypeHierarchy()来查找和导航类型。

祝你好运!

答案 1 :(得分:1)

你应该尝试:

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

您没有获得二进制类型的CompilationUnit。

答案 2 :(得分:0)

也许您可以使用IJavaProject.getAllPackageFragmentRoots()方法获取所有源文件夹,然后在其中获取ICompilationUnits。

答案 3 :(得分:0)

如果你只是为当前包列出java类名并将它们添加到类列表中(请用所有类的父类名替换PARENT_CLASS),我有一个更简单的eclipse项目解决方案:

    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);

        }
    }