1、 作用
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2、 角色
抽象主题接口(Count):声明真实对象和代理对象的共同接口;
代理类:代理对象角色内部含对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实类:定义了代理角色(proxy)所代表的具体对象。
3、 静态代理
抽象接口,代理类与真实类共同实现的接口。此接口定义了两个操作,查询与更新操作。
public interface Count { public void queryCount(); public void updateCount(); }
真实类,实现了抽象接口。
public class CountImpl implements Count { public void queryCount() { System.out.println("query the count..."); } public void updateCount() { System.out.println("update the count..."); } }
代理类,将真实类中每个操作加上事务。
public class CountProxy implements Count{ private Count count; public CountProxy(Count count) { this.count = count; } public void queryCount() { System.out.println("before transcation..."); count.queryCount(); System.out.println("after transcation..."); System.out.println(); } public void updateCount() { System.out.println("before transcation..."); count.updateCount(); System.out.println("after transcation..."); System.out.println(); } }
测试类
public class Test { public static void main(String[] args) { Count count = new CountImpl(); Count proxy = new CountProxy(count); count.queryCount(); count.updateCount(); System.out.println(); System.out.println("...proxy start..."); proxy.queryCount(); proxy.updateCount(); } }
结果
query the count... update the count... ...proxy start... before transcation... query the count... after transcation... before transcation... update the count... after transcation...
4、JDK动态代理
原理:在程序运行时,运用反射机制动态创建而成。
创建抽象接口。
public interface Count { public void queryCount(); public void updateCount(); }
真实类,实现了抽象接口。
public class CountImpl implements Count { public void queryCount() { System.out.println("query the count..."); } public void updateCount() { System.out.println("update the count..."); } }
代理类,将真实类中每个操作加上事务。
public class CountProxyFactory implements InvocationHandler { private Object target; public Object bind(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("before transcation..."); result = method.invoke(target, args); System.out.println("after transcation..."); System.out.println(); return result; } }
测试类。
public class Test { public static void main(String[] args) { Count count = new CountImpl(); Count proxy = (Count)new CountProxyFactory().bind(count); proxy.queryCount(); proxy.updateCount(); } }
运行结果。
before transcation... query the count... after transcation... before transcation... update the count... after transcation...
5、 总结
动态代理的应用很广,比如Spring AOP和多客户端的socket网络连接等。
相关推荐
JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
JDK动态代理源码下载,动态产生代理,实现对【不同类】,【不同方法】的代理
jdk动态代理技术详解,可以学习一下,不错的
通过一个简单例子来理解JDK动态代理的思想,资源为拷贝的视频讲解的内容。
Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy
java jdk 动态代理 演示demo
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
模拟JDK动态代理内部实现
NULL 博文链接:https://jummy.iteye.com/blog/255628
spring aop jdk 动态代理的底层实现解析模拟
JDK动态代理proxy的基本工作原理代码!!
* * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...
java代理机制 JDK动态代理和cglib代理 详解
java jdk 动态代理演示demo
java静态代理 jdk动态代理 cglib动态代理 代理原理
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
模拟JDK动态代理