代理模式相信大家都很了解,而动态代理模式在许多开源框架像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做的也是对传入的类进行相关的克隆,再通过反射生成相关的代理对象。