使用自定义类加载器中的javax.tools.ToolProvider?

Gil*_*ili 6 java compiler-construction casting classloader

似乎无法使用javax.tools.ToolProviderAnt或Webstart所需的自定义类加载器:http://bugs.sun.com/view_bug.do?video_id = 6548428

javax.tools.ToolProvider.getSystemJavaCompiler()加载javax.tools.JavaCompiler到URLClassLoader中,其父级是系统类加载器.API似乎不允许用户指定父类加载器.

如何使用javax.tools.JavaCompiler自定义类加载器?

例如:

  • Ant加载 MyParserTask
  • MyParserTask 解析Java源代码
  • MyParserTaskAntClassLoader该委托加载到系统类加载器
  • javax.tools.JavaCompilerURLClassLoader代理加载到系统类加载器

稍后,MyParserTask调用:

javax.tools.CompilationTask task = compiler.getTask(...);
com.sun.source.util.JavacTask javacTask = (com.sun.source.util.JavacTask) task;
javacTask.parse().next().accept(visitor, unused); // parsing happens here
Run Code Online (Sandbox Code Playgroud)
  • 看到这两个类如何驻留在不同的类加载器上,似乎没有一种方法可以MyParserTaskJavacTaskClassCastException出错的情况下进行交互.

有任何想法吗?

Thi*_*ilo 0

OSGi 经常出现此问题。有些人提出了“桥接类加载器”,例如这篇文章(它可能只桥接接口,而不桥接子类,所以也许你不能直接使用它)。

如果您只想在“外部”对象上调用几个方法,您也可以使用反射:

 javax.tools.CompilationTask task;
 task.getClass().getMethod("someMethodInTheSubclassThatICannotSee").invoke("a");
Run Code Online (Sandbox Code Playgroud)

基于反射思想,也许脚本语言也很有帮助(Groovy、Beanshell、JavaScript)。