【问题标题】:Getting all classes from the current workspace in Eclipse从 Eclipse 中的当前工作区获取所有类
【发布时间】:2011-03-17 10:13:40
【问题描述】:

我正在编写一个 Eclipse 插件,我试图创建一个方法,该方法在 ArrayList> 中返回工作区中的所有类(我添加了“\”以包含自 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 的类)。有什么建议吗?

【问题讨论】:

标签: java eclipse plugins class


【解决方案1】:

如果您只是在寻找列出当前包的 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);

        }
    }

【讨论】:

    【解决方案2】:

    你应该试试:

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

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

    【讨论】:

      【解决方案3】:

      我不确定你想做什么:

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

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

      如果我没看错,我想你可能想找到“编译单元”,而不是“类文件”。 “编译单元”对应于.java 源文件,而“类文件”对应于预构建的二进制类文件(通常在 JAR 中)。或者,也许你两者都需要。更好的是,听起来你真正想要的是那些里面的“类型”。

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

      还可以考虑使用 Java 搜索引擎(记录在上面)和 IType.newTypeHierarchy() 来查找和导航类型。

      祝你好运!

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-01
          • 2012-06-25
          • 2016-02-25
          • 1970-01-01
          • 2011-12-06
          相关资源
          最近更新 更多