两种动态代理的区别
- JDK使用接口作为代理
- CGLIB使用继承类作为代理
受益匪浅的一篇文章
我的code实现JDK动态代理
Vehicle接口
package com.ruider.reflexAgent.JDKAgent;
/**
* 可驾驶汽车
*/
public interface Vehicle {
void drive();
}
Rechargable接口
package com.ruider.reflexAgent.JDKAgent;
/**
* 可充电汽车
*/
public interface Rechargable {
void reCharge();
}
ElectricCar实现接口类
package com.ruider.reflexAgent.JDKAgent;
/**
* 可充电驾驶的汽车
*/
public class ElectricCar implements Vehicle, Rechargable {
@Override
public void drive() {
System.out.println("汽车drive");
}
@Override
public void reCharge() {
System.out.println("汽车reCharge");
}
}
触发管理器CarInvocationHandle,实现InvocationHandler接口
package com.ruider.reflexAgent.JDKAgent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CarInvocationHandle implements InvocationHandler {
private ElectricCar car;
public CarInvocationHandle (ElectricCar car) {
this.car = car;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("You are going to invoke "+method.getName()+" ...");
method.invoke(car, null);
System.out.println(method.getName()+" invocation Has Been finished...");
return null;
}
}
使用Proxy进行测试
package com.ruider.reflexAgent.JDKAgent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
ElectricCar car = new ElectricCar();
InvocationHandler carHandle = new CarInvocationHandle(car);
ClassLoader carClassLoader = ElectricCar.class.getClassLoader();
Class[] interfaces = ElectricCar.class.getInterfaces();
Object o = Proxy.newProxyInstance(carClassLoader,interfaces,carHandle);
Vehicle vehicle = (Vehicle)o;
vehicle.drive();
Rechargable rechargable = (Rechargable)o;
rechargable.reCharge();
}
}
结果显示
You are going to invoke drive ...
汽车drive
drive invocation Has Been finished...
You are going to invoke reCharge ...
汽车reCharge
reCharge invocation Has Been finished...