有没有一种方法让正在运行的Java程序编译Java源代码(作为字符串传递)?
Class newClass = Compiler.compile ("class ABC { void xyz {etc. etc. } }");
理想情况下,程序的类加载器应该能够解析传入源代码所引用的任何类。是否存在此类功能?有没有一种方法让正在运行的Java程序编译Java源代码(作为字符串传递)?
Class newClass = Compiler.compile ("class ABC { void xyz {etc. etc. } }");
理想情况下,程序的类加载器应该能够解析传入源代码所引用的任何类。是否存在此类功能?JavaCompiler
类和javax.tools
包中的其他类。Class<?> clazz = Class.forName("Test");
处遇到了java.lang.ClassNotFoundException: Test
的问题! - bachrimport java.net.URI;
import javax.tools.SimpleJavaFileObject;
public class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
public JavaSourceFromString( String name, String code) {
super( URI.create("string:///" + name.replace('.','/')
+ Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
可以按如下方式使用:
JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
if( jc == null) throw new Exception( "Compiler unavailable");
String code = "public class CustomProcessor { /*custom stuff*/ }";
JavaSourceFromString jsfs = new JavaSourceFromString( "CustomProcessor", code);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList( jsfs);
List<String> options = new ArrayList<String>();
options.add("-d");
options.add( compilationPath);
options.add( "-classpath");
URLClassLoader urlClassLoader =
(URLClassLoader)Thread.currentThread().getContextClassLoader();
StringBuilder sb = new StringBuilder();
for (URL url : urlClassLoader.getURLs()) {
sb.append(url.getFile()).append(File.pathSeparator);
}
sb.append( compilationPath);
options.add(sb.toString());
StringWriter output = new StringWriter();
boolean success = jc.getTask( output, null, null, options, null, fileObjects).call();
if( success) {
logger.info( LOG_PREFIX + "Class has been successfully compiled");
} else {
throw new Exception( "Compilation failed :" + output);
}
compilationPath
变量? - bachr这取决于你想做什么。 如果你只是想运行一些代码,可以使用BeanShell。它不是一个Java编译类,但非常有用,可以使某些事情更加灵活。
http://vanillajava.blogspot.com/2010/11/more-uses-for-dynamic-code-in-java.html
注意:我还没有在OSGi中使其工作。;)