Java:以编程方式导入类

时间:2015-07-22 19:45:13

标签: java eclipse-jdt

我有一个CompilationUnit,其中包含一个类,其中不会导入对另一个类的引用。 Eclipse很容易解决这类问题,并建议导入缺少的类(位于父包中)。

如何在不知道其名称或位置的情况下以编程方式导入缺少的类,以便在生成的Java类源文件中,导入如下所示:import com.foobar.missingclass

感谢。

编辑1: 回应一些评论:反射,注入,ClassLoader和其他运行时机制不是正确的选择,因为我通过Eclipse JDT API静态处理类。 请,我只是在寻找一种面向静态的解决方案。

仅供参考:我们如何从imports列出CompilationUnit

List<ImportDeclaration> existingImports = aCompilationUnit.imports();

Reference.

问题在于我不知道如何生成丢失的ImportDeclaration

感谢。

3 个答案:

答案 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();