代理模式有两种:cglib代理 和 jdk代理
目录
cglib代理
模拟火车售票收取平台费用
火车站售票类
public class TrainStation {
public void sell() {
System.out.println("车站售票");
}
}
售票代理工厂类
public class ProxyFactory implements MethodInterceptor {
private TrainStation station=new TrainStation();
public TrainStation getProxyObject(){
//创建代理类,类似jdk代理中的Proxy类
Enhancer enhancer=new Enhancer();
//设置要实现方法的父类
enhancer.setSuperclass(TrainStation.class);
//设置回调函数
enhancer.setCallback(this);
//创建代理对象
TrainStation proxyObject = (TrainStation) enhancer.create();
return proxyObject;
}
/*
实际执行方法
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("代售点收取一定费用(CGLIB代理)"); //增强方法
Object invoke = method.invoke(station, objects);
return invoke;
}
}
jdk代理
模拟火车售票收取平台费用
售票接口
public interface SellTicket {
void sell();
}
火车站实现接口
/**
* @author Dsmash
*/
public class TrainStation implements SellTicket {
@Override
public void sell() {
System.out.println("车站售票");
}
}
代理实现工厂
public class ProxyFactory {
private TrainStation trainStation = new TrainStation();
public SellTicket getProxyObject() {
SellTicket o = (SellTicket) Proxy.newProxyInstance(
/*
ClassLoader 获取对象类加载器
Class<?>[] interfaces 代理类实现的接口对象
InvocationHandler 代理对象调用处理程序
*/
trainStation.getClass().getClassLoader(),
trainStation.getClass().getInterfaces(),
new InvocationHandler() {
/**
* @param proxy :代理对象。和proxyobject一个对象,在invoke方法中基本不用
* @param method :对接口中的方法进行封装的method对象
* @param args :调用方法的实际参数
* 可以增强方法 、 返回值 、方法的传值
* @return
* @throws Throwable
*/
@Override
public SellTicket invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("invoke函数调用");
System.out.println("代售点收取一定的费用(jdk动态代理)");
SellTicket invoke = (SellTicket) method.invoke(trainStation, args);
return invoke;
}
}
);
return o;
}
}