package testReflect;
import java.net.URI;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
/**
* 利用java反射,我们可以解析一个.class文件,将这个字节码文件加载到内存(vm方法区)中
* 但是我们如何将一段java代码转换成字节码文件哪?理所当然是使用了java中javac.exe将java代码转化成了.class文件
* 现在模拟这个编译过程,将一段String(java 类)转换成.class
*
*/
public class TestClass {
public static void main(String[] args) {
//准备的一段代码片段
String source = "public class BinaryFile{"
+ "public void test() {"
+ "System.out.println(\"Hello World!\");"
+ "} "
+ "}";
//用来进行翻译的java类
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StringSourceJavaObject sourceObject = new TestClass.StringSourceJavaObject("BinaryFile", source);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
boolean result = task.call();
//翻译成功,会在顶目录中显示
if (result) {
System.out.println("文件编译成功");
}
}
private static 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;
}
}
}