JDK动态代理。
来源:互联网 发布:雷蛇鼠标和mac蓝牙配对 编辑:程序博客网 时间:2024/05/16 01:39
使用JDK动态代理 被代理的类 ,必须要实现接口。
PersonDao.java
package com.zf.proxy;public interface PersonDao {public void add();public void update();}
PersonDaoImpl.java
package com.zf.proxy;public class PersonDaoImpl implements PersonDao {@Overridepublic void add() {System.out.println("personDao add()...");}@Overridepublic void update() {System.out.println("personDao update()..."); }}
ProxyFactory.java
package com.zf.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyFactory<E> implements InvocationHandler{private E target ;public ProxyFactory(E target){this.target = target ;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("before...");Object obj = method.invoke(target, args);System.out.println("after...");return obj ;}public E getProxyInstance(){return (E)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}}
Test.java
package com.zf.proxy;public class Test {public static void main(String[] args) {PersonDao personDao = new PersonDaoImpl();//泛型 传递接口类型进去ProxyFactory<PersonDao> pf = new ProxyFactory<PersonDao>(personDao);personDao = pf.getProxyInstance();personDao.update();}}
代理链条的实现。
package com.zf.proxy;public interface BaseProxy<E> {E getProxyInstance();void setTarget(E target);}
package com.zf.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class TimeProxyFactory<E> implements InvocationHandler , BaseProxy<E>{private E target ;@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("log:" + target.getClass().getName() + "." + method.getName() + " start...");Object obj = method.invoke(target, args);System.out.println("log:" + target.getClass().getName() + "." + method.getName() + " end...");return obj ;} public E getProxyInstance(){return (E)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}@Overridepublic void setTarget(E target) {this.target = target ;}}
package com.zf.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class LogProxyFactory<E> implements InvocationHandler, BaseProxy<E>{private E target ;@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {long start = System.currentTimeMillis();Object obj = method.invoke(target, args);long end = System.currentTimeMillis();System.out.printf("方法%s用时:%d\n" , target.getClass().getName() + "." + method.getName() , (end - start));return obj ;}//这里会将代理对象转换为E的类型,所以E应该为接口类型。而不能是接口的实现类。public E getProxyInstance(){return (E)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}@Overridepublic void setTarget(E target) {this.target = target ;}}
package com.zf.proxy;public class ProxyChain<E> { private E target ; public ProxyChain(E target){this.target = target ;}public void addProxy(BaseProxy<E> bp){bp.setTarget(target);target = bp.getProxyInstance();}public E getProxyInstance() {return target; }}
package com.zf.proxy;public class Test {public static void main(String[] args) {PersonDao personDao = new PersonDaoImpl();//泛型 传递接口类型进去ProxyChain<PersonDao> pc = new ProxyChain<PersonDao>(personDao);pc.addProxy(new TimeProxyFactory<PersonDao>());pc.addProxy(new LogProxyFactory<PersonDao>());personDao = pc.getProxyInstance();personDao.update();}}
- 代理模式,JDK动态代理
- Java动态代理--jdk代理
- 代理模式-JDK动态代理
- JDK中的动态代理
- JDK动态代理
- JDK动态代理
- JDK动态代理
- jdk动态代理(暂)
- JDK动态代理
- JDK动态代理实例
- jdk 动态代理
- JDK动态代理
- JDK动态代理说明
- jdk动态代理
- JDKDynamicProxy JDK动态代理
- JDK动态代理实现
- JDK 动态代理
- JDK动态代理
- live555服务器 h264实时流丢包问题
- MIME Type
- PHP MySQL CRUD操作类
- linux内核对S3C2410睡眠模式的支持
- Android ListView(GridView) 滑动 拖动 背景为黑色的解决办法
- JDK动态代理。
- oracle 管道化表函数(Pipelined Table)
- Android模拟器中访问局域网地址
- jsp xss
- applicationContext.xml 配置文件的一些认识
- 阳历阴历转换
- MFC中嵌入HALCON窗口
- UIView Animation的一些用法
- windows内存管理之雾里探花