之前我们分享了一篇静态代理,今天分享一下我对动态代理的理解
=====相关链接====
想了解静态代理的同学请点击幽暗城传送门
静态代理有两种实现方式,同样动态代理也有两种,分别是通过jdk和cglib来实现,下面我们分别来说下两者的实现方式
jdk代理:只能代理实现了接口的类,没有实现接口的类不能实现动态代理,看下面代码
行驶时间代理类
public class TimeHandler implements InvocationHandler {
public TimeHandler(Object target){
super();
this.target = target;
}
private Object target;
/**
* auth wangsongyan
* @param proxy 被代理对象
* @param method 被代理对象的方法
* @param args 方法的参数
* @return Object 方法的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long starttime = System.currentTimeMillis();
System.out.println("汽车开始行驶");
method.invoke(target);
long endtime = System.currentTimeMillis();
System.out.println("汽车结束行驶,行驶时间:" + (endtime - starttime ) +"毫秒");
return null;
}
}
日志代理类
public class LogHandler implements InvocationHandler {
public LogHandler(Object target) {
super();
this.target = target;
}
private Object target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("发信息给老婆说正在开车");
method.invoke(target);
System.out.println("发信息告诉老婆到家了下车了");
return null;
}
}
Moveable类
public interface Moveable {
void move();
void stop();
}
测试类
public class Test {
public static void main(String[] args) {
Car car = new Car();
InvocationHandler timeHandler = new TimeHandler(car);
Class<?> cls = car.getClass();
/**
* loader 类加载器
* interfaces 实现接口
* h InvocationHandler
*/
Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), timeHandler);
LogHandler logHandler = new LogHandler(m);
Moveable m1 = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), logHandler);
m1.move();
}
}
我们这里用的是jdk的Proxy类实现的,这里要求的是代理类必须都实现同一接口,由于cglib动态代理东西比较多,所以不在这篇分享中写出,后面会继续分享cglib是如何实现动态代理的