Gil*_*ili 6 java compiler-construction casting classloader
似乎无法使用javax.tools.ToolProvider
Ant或Webstart所需的自定义类加载器:http://bugs.sun.com/view_bug.do?video_id = 6548428
javax.tools.ToolProvider.getSystemJavaCompiler()
加载javax.tools.JavaCompiler
到URLClassLoader中,其父级是系统类加载器.API似乎不允许用户指定父类加载器.
如何使用javax.tools.JavaCompiler
自定义类加载器?
例如:
MyParserTask
MyParserTask
解析Java源代码MyParserTask
由AntClassLoader
该委托加载到系统类加载器javax.tools.JavaCompiler
由URLClassLoader
代理加载到系统类加载器稍后,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)
MyParserTask
在JavacTask
不ClassCastException
出错的情况下进行交互.有任何想法吗?
OSGi 经常出现此问题。有些人提出了“桥接类加载器”,例如这篇文章(它可能只桥接接口,而不桥接子类,所以也许你不能直接使用它)。
如果您只想在“外部”对象上调用几个方法,您也可以使用反射:
javax.tools.CompilationTask task;
task.getClass().getMethod("someMethodInTheSubclassThatICannotSee").invoke("a");
Run Code Online (Sandbox Code Playgroud)
基于反射思想,也许脚本语言也很有帮助(Groovy、Beanshell、JavaScript)。