今天看到一个有意思的程序,以前没用过,孤陋寡闻了,代码如下,使用javac和java就可以直接运行
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String source = "public class Test3 {"
+ "public void AAA() {"
+ "System.out.println(\"Hello Class\");"
+ "}"
+ "}";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new StringSourceJavaObject("Test3", source);
List fileObjects = Arrays.asList(sourceObject);
CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
boolean result = task.call();
if(result){
System.out.println("Yes");
try {
Class cls = Class.forName("Test3");
Object o = cls.newInstance();
Method m = cls.getMethod("AAA");
m.invoke(o);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class StringSourceJavaObject extends SimpleJavaFileObject{
private String content = null;
public StringSourceJavaObject(String name, String content){
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
this.content = content;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
}