字节码的控制

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;
		      }

		      
		   }
		
	
	

}

  

posted @ 2017-08-31 21:53  鱼君  阅读(184)  评论(0编辑  收藏  举报