【发布时间】:2016-07-19 20:25:53
【问题描述】:
我正在使用来自 IBM 旧博文的 this code,该博文介绍了如何在运行时编译和使用 Java 类。代码大部分工作得很好(顺便说一句,写得很好),但不幸的是,它不适用于我的一个用例,其中正在编译的类引用另一个只能由 classLoader 提供的类提供给CharSequenceCompiler(来自博客文章),而不是由应用程序类加载器提供。
更具体地说,我传递给CharSequenceCompiler 的 ClassLoader 是一个 OSGi 类加载器。
拥有这个类加载器的包可以找到并返回一个类,比如Foo。
class Foo { public static String FOO = "F"; }
我知道如果你这样做 classLoader.findClass("Foo"); 这会起作用,因为当我从调试器调用它时它会起作用。
现在,从我在运行时编译的类中,比如Dynamic,我需要使用Foo...所以我将Foo bundle 的ClassLoader 传递给CharSequenceCompiler,然后要求它编译Dynamic :
class Dynamic { public static String D = Foo.FOO; }
这会导致以下错误:
error: cannot find symbol
Foo.FOO;
^
symbol: variable Foo
如果Foo 与CharSequenceCompiler 在同一个项目中,那么它可以工作......所以从正确的类加载器加载类显然是一个问题。
我已经调试了这段代码几天(或晚上,tbh),但无法找出为什么我提供给编译器的 classLoader 甚至从未被询问过这个类...
FileManager被要求list()每个包中的资源,但是即使我使用调试器手动将FileObject添加到返回的列表中,它仍然不起作用。
由于调试器无法穿透 javac 内部使用的本机类,我无法在这方面取得进展……有没有人知道编译器的内部知识可以解释发生了什么?
【问题讨论】:
标签: java javac java-compiler-api