Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Eclipse中从当前工作区获取所有类_Java_Eclipse_Plugins_Class - Fatal编程技术网

Java 在Eclipse中从当前工作区获取所有类

Java 在Eclipse中从当前工作区获取所有类,java,eclipse,plugins,class,Java,Eclipse,Plugins,Class,我正在编写一个Eclipse插件,我试图创建一个方法,在ArrayList中返回工作区中的所有类(我添加了“\”以包含通用括号,因为html不允许我这样做) 以下是我的代码: private ArrayList<Class<?>> getAllClasses() throws JavaModelException { ArrayList<Class<?>> classList = new ArrayList<Class<?>&

我正在编写一个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;
}

private ArrayList>classList=new ArrayList也许您可以使用IJavaProject.getAllPackageFragmentRoots()方法获取所有源文件夹,然后获取其中的ICompilationUnits。

我不确定您想做什么:

  • 在正在运行的Eclipse插件中,显示在JVM中运行的所有类(即用于其他编辑器、视图、Eclipse机器的类)
  • 在运行的Eclipse插件中,是否显示工作区中的开放Java项目中构建的所有类?(既然你用了“工作区”这个词,我怀疑这就是你想要的。)
注意,在后一种情况下,您将无法获得实际的Java
Class
对象,因为正在编辑和编译的项目没有加载到与插件相同的JVM中执行。您的插件代码将与EclipseIDE和EclipseJDT工具代码一起执行;只有在启动或调试其中一个项目时,才会加载开放项目中的类以执行(在某处生成
Class
对象)。在这种情况下,您正在处理一个全新的JVM,而您的插件已经不存在了。这有意义吗

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

请查看一些非常难以找到的非常好的信息。请注意,在Java模型级别可以进行一些分析,但更详细的分析(例如,查看“内部”方法定义)将需要将代码块解析到AST中,然后再进行分析。Java模型使用起来非常方便,但是AST的东西在第一次使用时可能会有点让人望而生畏

还考虑java搜索引擎(在上面记录的)和<代码> Iype .NeXyType()/<代码>查找和导航类型。 祝你好运

您应该尝试:

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

您没有二进制类型的CompliationUnit。

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

List arraylistofclass=new ArrayList();
String currentDir=new java.io.File(“”.toURI().toString().split(“File:/”)[1];
System.out.println(“currentDir=“+currentDir”);
字符串[]dirStringTab=currentDir.split(“/”);
字符串currentPackageName=dirStringTab[dirStringTab.length-1];
System.out.println(“currentPackageName=“+currentPackageName”);
文件目录=新文件(“./src/”+currentPackageName+“/”);
File[]filesList=dir.listFiles();
字符串javaClassNameWithoutExtension=“”;
用于(文件:filelist){
if(file.isFile()){
System.out.println(javaClassNameWithoutExtension);
javaClassNameWithoutExtension=file.getName().split(“.java”)[0];
c类=Class.forName(JavaClassName不带扩展名);
对象a=c.newInstance();
添加(a);
}
}
请参阅这里,您可以找到JDT模型的一个很好的描述。
    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);

        }
    }