首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之动态代理

2012-11-21 
设计模式之动态代理动态代理的具体实现实现代码代理方法类的接口InvocationHandlerpackage com.proxyimp

设计模式之动态代理


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





热点排行