Java 在Eclipse中从当前工作区获取所有类
我正在编写一个Eclipse插件,我试图创建一个方法,在ArrayList中返回工作区中的所有类(我添加了“\”以包含通用括号,因为html不允许我这样做) 以下是我的代码: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<?>&
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项目中构建的所有类?(既然你用了“工作区”这个词,我怀疑这就是你想要的。)
注意,在后一种情况下,您将无法获得实际的JavaClass
对象,因为正在编辑和编译的项目没有加载到与插件相同的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);
}
}