浅析Jdk动态代理
众所周知,Spring现已是Java企业级开发的重要角色。绝大多数的Java企业级应用都使用了Spring,而Spring源码设计中动态代理又是常常被使用到。今天我们就来简单讨论一下动态代理中的JDK动态代理(还有一种是CGLIB动态代理,这个以后再说)。
不管是JDK还是CGLIB得动态代理都有这样的一些特点:
1.都有执行中和被代理对象
2.对于被代理对象而言,有些事情我必需要去做,但是我又没有时间或不想去做,这时我会去找执行者帮我完成这些事情。
3.执行者需要被代理人的个人资料
举个生活中的例子:
我现在需要去租房子(这是一件必需要完成的事情),但是工作时间很紧,没有时间也没有房源的。这时候我就会去找租房子中介,告诉他们我要找的房子的一些要求和我个人的资料。由租房中介帮我去找满足我要求的房子。
下面我们就来使用JDK动态代理完成这样的一个生活案例:
首先创建一个Person的接口,里面有找房子的方法,代表需要找房子的人
package com.zxy.jdk; /** * 需要租房子的人 */ public interface Person { void findHouse(); }
创建一个Me的类(我现在就是要找房子的那个人)
package com.zxy.jdk; /** * 我现在就是那个需要租房子的人 */ public class Me implements Person { private String name; //我对房子的要求 private String requirement; @Override public void findHouse() { System.out.println("130平方"); System.out.println("临近地铁"); System.out.println("环境优美"); } }
在创建一个Broker(中介)
package com.zxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 租房中介 */ public class Broker implements InvocationHandler { private Object target; //获取被代理人的个人资料 public Object getInstance(Object target){ this.target = target; Class clazz = target.getClass(); //把我的资料给到了中介 return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this); } @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { System.out.println("开始在房源里面寻找...."); System.out.println("突然发现找到了!"); Object result = method.invoke(target, objects); System.out.println("我完成了和房东的签约"); return result; } }
测试一下:
package com.zxy.jdk; public class Test { public static void main(String[] args) { //中介对象 Broker broker = new Broker(); //把我的资料给到了中介,仿佛就像是我亲自在找房子一样 Person me = (Person) broker.getInstance(new Me()); me.findHouse(); } }

到此我们的一个简单的jdk动态代理,就实现了。动态代理的用处十分的广泛,Spring中的aop,使用的就是动态代理技术,而aop常用在事务管理,日志管理等多种场合。他们的基础都是动态代理技术。
如有不正确之处,希望不吝赐教。

浙公网安备 33010602011771号