【问题标题】:How to provide an interface to JavaCompiler when compiling a source file dynamically?动态编译源文件时如何为JavaCompiler提供接口?
【发布时间】:2011-03-27 17:12:19
【问题描述】:

我试图在运行时编译和加载一个类,但不知道该类的包。我确实知道该类应该符合接口,以及源的位置(以及类名)。我正在尝试以下方法:

/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());

Test.java 文件的样子

import foo.Itest;
public class Test implements Itest{
...
}

我从编译器收到cannot find symbol symbol : class Itest 错误。如何为编译器提供接口(已加载)以避免此错误?

[编辑 - 已解决]:错误来自接口是ITest 并且源引用了Itest 接口这一事实。

【问题讨论】:

标签: java dynamic runtime compilation classloader


【解决方案1】:

compiler.run() 似乎在外部运行,需要设置类路径。您是否尝试使用最后一个参数 args 将合适的类路径设置传递给 run() 调用?也许这就是为什么ToolProvider.getSystemToolClassLoader()

这个stackoverflow post 也可能对你有所帮助。

【讨论】:

  • 感谢 jowierun,事实证明这是一个更普通的错误。
【解决方案2】:

不确定这是否是您要查找的内容,但正如 @Phil here 所述,您可以尝试在 compiler.run 方法中传递类路径参数。

【讨论】:

    【解决方案3】:

    您是否考虑过使用javassist 或类似的方式生成您的课程?

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2014-11-24
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多