字节码的控制
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; } } }