Tag: java compiler api

如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?

我的用例是使用JDK 6中提供的ToolProvider和JavaCompiler类从java程序编译生成的源文件。源文件包含对上下文类加载器中的类的引用(它在J2EE容器中运行),但不包含在系统类加载器中。 我的理解是,默认情况下,ToolProvider将使用系统类加载器创建JavaCompiler实例。 有没有办法为JavaCompiler指定一个类加载器? 我尝试了这种方法,从IBM DeveloperWorks上的某些东西进行了修改: FileManagerImpl fm = new FileManagerImpl(compiler.getStandardFileManager(null, null, null);); 将FileManagerImpl定义为: static final class FileManagerImpl extends ForwardingJavaFileManager { public FileManagerImpl(JavaFileManager fileManager) { super(fileManager); } @Override public ClassLoader getClassLoader(JavaFileManager.Location location) { new Exception().printStackTrace(); return Thread.currentThread().getContextClassLoader(); } } 堆栈跟踪表明它仅在注释处理期间调用一次。 我validation了要编译的源文件中引用的类不在系统类路径上,但可以从上下文类加载器中获得。

是否有可能以编程方式仅在内存中编译java源代码?

我找到了很多参考资料,解释了如何使用JavaCompiler类以编程方式编译Java类: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null, “a_file_name”); 但是,我想知道是否有一个开源库让我编译以编程方式生成的源代码(因此不涉及src文件)并在输出流中生成一些字节代码(不在文件系统中生成类文件) )。 例如,我正在寻找能够写这样的东西: InputStream input = generateSourceCode(); OutputStream output = getByteCode(input); doCoolStuffWithByteCode(output); 谢谢你的帮助。