详解Java动态代理
代理模式相信大家都很了解,而动态代理模式在许多开源框架像Srping,Mybatis等使用的很广泛,下面通过一个动态代理的实例,已经趴一趴Java动态代理的源码来进行详解。
1:这里新建一个person接口,里面有一个测试方法:
package com.proxy; /** * @author: shichao * @date: 2018/12/6 * @description: */ public interface Person { void doSomeWork(); }
2:下面编写一个我们要进行代理的target类:
package com.proxy; /** * @author: shichao * @date: 2018/12/6 * @description: */ public class Sc implements Person { @Override public void doSomeWork() { try { Thread.currentThread().sleep(2000); System.out.println("SC is do something"); } catch (InterruptedException e) { e.printStackTrace(); } } }
3:编写实现了jdk提供的InvocationHandler代理类Handle:
package com.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author: shichao * @date: 2018/12/6 * @description: */ public class PersonInvoctionHandle<T> implements InvocationHandler { //被代理对象 T target; public PersonInvoctionHandle(T target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始时间:"+System.currentTimeMillis()); Object res = method.invoke(target,args);//调用代理方法 System.out.println("结束时间:"+System.currentTimeMillis()); return res; } }
4:使用Proxy生成动态代理对象:
package com.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * @author: shichao * @date: 2018/12/6 * @description: */ public class proxyTest { public static void main(String[] args) { Person sc = new Sc(); //获取代理handle InvocationHandler invocationHandler = new PersonInvoctionHandle<Person>(sc); //获取动态代理对象 Person proxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),new Class<?>[]{Person.class},invocationHandler); proxy.doSomeWork(); } }
5:执行结果:
开始时间:1544088511407
SC is do something
结束时间:1544088513411
代码解析:java做的也是对传入的类进行相关的克隆,再通过反射生成相关的代理对象。