iwillbegenius 发表于 2013-1-26 14:45:00

设计模式之动态代理

http://dl.iteye.com/upload/attachment/465168/8f9582b6-59e7-30c9-889a-0cdef5cb8288.png

动态代理的具体实现实现代码
代理方法类的接口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());}}

Moveable接口

package com.proxy;public interface Moveable {       public void move();}

具体实体类Tank.java
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(); }}

动态生成代理类 Proxy.java

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;}}
页: [1]
查看完整版本: 设计模式之动态代理