设计模式之动态代理

动态代理的具体实现实现代码
代理方法类的接口InvocationHandler;
package com.proxy;import java.lang.reflect.Method;import com.proxy.InvocationHandler;/** * 时间代理类 * @author Administrator * */public class TimeHandler implements InvocationHandler{/** * 要被代理的对象 */private Object target;public TimeHandler(Object target) {super();this.target = target;}/** * 在方法的前后可以添加自己的逻辑 */@Overridepublic void invoke(Method method) {System.out.println("start"+System.currentTimeMillis());try {method.invoke(target);} catch (Exception e) {e.printStackTrace();}System.out.println("end"+System.currentTimeMillis());}}package com.proxy;public interface Moveable { public void move();}package com.proxy;/** * 坦克类 * @author Administrator * */public class Tank implements Moveable{@Overridepublic void move() {System.out.println("坦克开起来...");} public static void main(String[] args) throws Exception { Tank k=new Tank(); Moveable m=(Moveable) Proxy.newProxyInstance(Moveable.class , new TimeHandler(k)); m.move(); }}package com.proxy;import java.io.File;import java.io.FileWriter;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;import javax.tools.JavaCompiler;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;import javax.tools.JavaCompiler.CompilationTask;/** * 动态代理类 * @author Administrator * */public class Proxy { /** * * @param infce 要代理interface * @param h 需要代理的方法 * @return * @throws Exception */public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASMString methodStr = "";String rt = "\r\n";Method[] methods = infce.getMethods();/** * 得到该类的所有方法,都进行代理 */for(Method m : methods) {methodStr += "@Override" + rt + "public void " + m.getName() + "() {" + rt + " try {" + rt + " Method md = " + infce.getName() + ".class.getMethod("" + m.getName() + "");" + rt + " h.invoke( md);" + rt + " }catch(Exception e) {e.printStackTrace();}" + rt + "}";}String src = "package com.proxy;" + rt +"import java.lang.reflect.Method;" + rt +"public class $Proxy1 implements " + infce.getName() + "{" + rt +" public $Proxy1(InvocationHandler h) {" + rt +" this.h = h;" + rt +" }" + rt +" com.proxy.InvocationHandler h;" + rt +methodStr +"}";String fileName = "D:/EclipseWorkplace/JavaProject/DesignPattern/src/com/proxy/$Proxy1.java";File f = new File(fileName);FileWriter fw = new FileWriter(f);fw.write(src);fw.flush();fw.close();/** * 编译目标类 */JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);Iterable units = fileMgr.getJavaFileObjects(fileName);CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);t.call();fileMgr.close();/** * 把目标类加入内存并且创建一个实例 */URL[] urls = new URL[] {new URL("file:/" + "D:/EclipseWorkplace/JavaProject/DesignPattern/src/")};URLClassLoader ul = new URLClassLoader(urls);Class c = ul.loadClass("com.proxy.$Proxy1");Constructor ctr = c.getConstructor(InvocationHandler.class);Object m = ctr.newInstance(h);return m;}}