目前java动态代理的实现分为两种
1.基于JDK的动态代理
2.基于CGILB的动态代理
代理本质就是实现方法的控制和增强。
jdk动态代理
重点: InvocationHandler 和 Proxy类
比如下面的比亚迪, 在不修改BYD.java的源码基础上, 使用jdk动态代理, 对BYD进行增强。
我们发现jdk动态代理实际上是创建一个类继承了Proxy,实现了Car的接口
BYDPlus.java
public class BYDPlus implements InvocationHandler {
private Car car;
public BYDPlus(Car car) {
super();
this.car = car;
}
public static Car getProxy(Car car) {
Class<? extends Car> clazz = car.getClass();
Object newProxyInstance = Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new BYDPlus(car));
return (Car) newProxyInstance;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("比亚迪升级了...");
System.out.println("比亚迪播放着网抑云音乐...");
Object invoke = method.invoke(car, args);
return invoke;
}
}
我们没有修改BYD.java源码, 但是我们使用了代理类BYDPlus, 去对BYD做了增强
cglib动态代理
cglib 直接就是创建了一个Tsla的子类, 所以使用cglib的类不能是final类。
重点: Enhancer, MethodInterceptor
public class TslaPlus {
public static Tsla getProxy(Tsla tsla) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(tsla.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("特斯拉升级了...");
System.out.println("特斯拉播放着网抑云音乐...");
Object invoke = method.invoke(tsla, args);
return invoke;
}
});
return (Tsla) enhancer.create();
}
}