使用JDT在独立Java应用程序中提取IcompilationUnits
我正在编写一个普通的Java应用程序,希望提取输入项目的所有ICompilationUnit(这不是必需的) 由Eclipse开发)。由于我没有开发Eclipse插件,因此无法使用以下代码提取ICompilationUnit:使用JDT在独立Java应用程序中提取IcompilationUnits,java,eclipse,eclipse-jdt,compilationunit,Java,Eclipse,Eclipse Jdt,Compilationunit,我正在编写一个普通的Java应用程序,希望提取输入项目的所有ICompilationUnit(这不是必需的) 由Eclipse开发)。由于我没有开发Eclipse插件,因此无法使用以下代码提取ICompilationUnit: IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPath path = Path.fromOSString(source.getAbsolutePath()); IFile file = workspace.
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPath path = Path.fromOSString(source.getAbsolutePath());
IFile file = workspace.getRoot().getFileForLocation(path);
ICompilationUnit compilationUnit = (ICompilationUnit) JavaCore.create(file);
目前,我正在使用下面的代码来解析输入Java文件。(str包含输入java文件的源代码)
但是,下面的代码返回null,因为它不是从Java元素创建的
ICompilationUnit icu = (ICompilationUnit)compilationUnit.getJavaElement();
问题:有没有办法在普通Java应用程序中提取ICompilationUnits?JDT搜索引擎需要一个索引。在IDE中,索引是在构建工作区期间创建的。这意味着没有工作空间,就没有现成的方法来使用搜索引擎 从理论上讲,您可以实现自己的索引,但这绝对不是推荐的 还有两种选择:
- PDE是一种无头应用程序,用于运行JDT自己的测试。工作区在使用
命令行参数传递的位置中自动可用-data
- JDT的,它提供了大量实用程序,用于以编程方式创建和配置Java项目
- AbstractJavaModelTests的子类,其中有无数关于如何使用这些Java项目的示例,包括搜索
如果您选择任何测试类,调用
run as>run configurations…
然后创建类型为JUnit Plug-in-test
的启动配置,并在选项卡Main
上选择运行应用程序:[无应用程序]-无头模式
您指的是什么“提取ICompilationUnits”?使用编译单元
可以执行cu.accept(new ASTVisitor(true){…})
查找特定元素。我想使用搜索引擎(ICompilationUnit[]工作副本)正因为如此,我需要提取ICompilationUnit。我明白了。getJavaElement
返回null
,因为parser.setSource(str.toCharArray());
而不是parser.setSource(IClassFile)
。我想使用ASTVisitor
比创建IClassFile
和使用SearchEngine
查找特定元素更容易。你在搜索什么?我想查找项目中定义的方法和字段的所有调用。如果我在编写eclipse插件,有一个简单的方法。但是,由于我正在编写一个独立的应用程序[ResourcesPlugin.getWorkspace();]无法工作,我无法编写其余指令。请告诉我您是否知道使用JDT在独立java应用程序中查找方法和字段引用的示例代码。如果您添加parser.setEnvironment(…)
对于您的代码,您可以使用cu.accept(new ASTVisitor(true){…})
访问AST节点。在ASTVisitor
中,使用IBinding binding=node.resolveBinding()至少覆盖QualifiedName
和SimpleName
的方法;
当且仅当binding instanceof IMethodBinding
为true,并且对于字段访问,以下为true时,才有方法调用或引用:binding instanceof IVariableBinding
和((IVariableBinding)binding)。isField()
。请提供第二个选项中的示例代码。@Arash您可能对我在GitHub上提供的示例感兴趣。我在JUnit测试中运行JDT代码,并将示例分为两类:独立的和需要osgi的
ICompilationUnit icu = (ICompilationUnit)compilationUnit.getJavaElement();