这是我的代码:
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的类)。有什么建议吗?
答案 0 :(得分:1)
我不确定你想做什么:
注意在后一种情况下,您将无法获得实际的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);
}
}