Java动态代理和cglib代理

目前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();
	}

}

demo源码