//一、声明一段源码,动态产生代理 //windows系统中的回车换行符\r\n String rt = "\r\n"; String methodStr=""; for(Method m : infce.getMethods()) { methodStr += " @Override"+rt+ " public void " + m.getName() +"() {"++ " try{"+rt+ " Method md = "+infce.getName+".class.getMethod(\""+m.getName()+"\""+rt+ " h.invoke(this,md);"+rt+ " }catch(Exception e){e.printStackTra();}"+rt+ "}"; } String str= "package com.imooc.proxy;"+rt+ "import java.lang.reflect.Method;"+rt+ "import com.imooc.proxy.InvocationHandler+rt+ "public class $Proxy0 implements+infce.getName()+ " {"+rt+ " public $Proxy0(InvocationHandler h) +rt+ " this.h = h;"+rt+ "}"+rt+ " private InvocationHandler h;"+rt+ methodStr+rt+ "}";
//产生代理类的Java文件 String filename = System.getProperty("user.dir")+"/bin/com/imooc/proxy/$Proxy0.java"; File file = new File(filename); FileUtils.writeStringToFile(file, str);
JavaCompiler comproiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = comproiler.getStandardFileManager(null, null, null);
Iterable units = fileManager.getJavaFileObjects(file);
CompilationTask task = comproiler.getTask(null, fileManager, null, null, null, units);
task.call();
fileManager.close();
//由于生成的文件在bin目录下,能够直接使用ClassLoader进行加载 ClassLoader cl = ClassLoader.getSystemClassLoader(); //默认生成的代理类名称均为 $Proxy0 Class c = cl.loadClass("com.imooc.proxy.$Proxy0");
//获取类的构造函数,建立类的实例 Constructor ctr = c.getConstructor(InvocationHandler.class); return ctr.newInstance(h);
建立一个InvocationHandler(专门作事务处理)java
Car car = new Car(); InvocationHandler h = new TimeHandler(car); Moveable m = (Moveable) Proxy.newProxyInstance(Moveable.class,h); m.move();