我有一个CompilationUnit
,其中包含一个类,其中不会导入对另一个类的引用。
Eclipse很容易解决这类问题,并建议导入缺少的类(位于父包中)。
如何在不知道其名称或位置的情况下以编程方式导入缺少的类,以便在生成的Java类源文件中,导入如下所示:import com.foobar.missingclass
。
感谢。
编辑1: 回应一些评论:反射,注入,ClassLoader和其他运行时机制不是正确的选择,因为我通过Eclipse JDT API静态处理类。 请,我只是在寻找一种面向静态的解决方案。
仅供参考:我们如何从imports
列出CompilationUnit
:
List<ImportDeclaration> existingImports = aCompilationUnit.imports();
问题在于我不知道如何生成丢失的ImportDeclaration
。
感谢。
答案 0 :(得分:1)
引用我自己的answer in the JDT forum:
有关操作Java文件的导入,请参阅类org.eclipse.jdt.core.dom.rewrite.ImportRewrite:javadoc概述了其用法。
如果你拥有的是一个无法解析的简单名称,那么像ASTResolving.guessBindingForTypeReference(node)这样的实用程序会派上用场。
如果这对您不起作用,您可能必须使用org.eclipse.jdt.core.search.SearchEngine并以某种方式处理给定简单名称的潜在许多匹配。
我要补充一点:如果创建ImportDeclaration是您唯一的问题,那么请使用aCompilationUnit.getAST().newImportDeclaration()
,但使用ImportRewrite
会更加强大,因为它会直接生成TextEdit
所需的{{1}}更新文件。
答案 1 :(得分:0)
您可以使用Reflections之类的库,因此请在类路径中搜索任何合适的类。当然,如果您有多个具有给定名称的课程,您没有太多选择,只能猜测(根据上下文)或询问用户。
答案 2 :(得分:0)
您可以使用ClassLoader来做到这一点。见:
示例为http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();