一、被代理对象
public class TrainStation implements SellTickets {
@Override
public void sell() {
System.out.println("火车站卖票");
}
}
二、规定要实现的规则
public interface SellTickets {
void sell();
}
三、代理工厂类
public class ProxyFactory {
//声明目标对象
private TrainStation trainStation = new TrainStation();
public SellTickets getProxyObject(){
//newProxyInstance,jdk获取代理对象的接口,返回的是一个接口,不能用实现类接收
SellTickets proxyObject = (SellTickets) Proxy.newProxyInstance(
trainStation.getClass().getClassLoader(),
trainStation.getClass().getInterfaces(),
/**
* proxy:代理对象,和proxyObject对象是同一个,在invoke中基本不用
* method: 对接口中的方法进行封装的method对象
* args:调用方法的实际参数
*
* 返回值:方法的返回值,本例中就是sell()的返回值
*/
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//这里对TrainStation.sell()进行了增强,类似平时的日志打印
System.out.println("中间商赚差价--jdk");
//执行目标对象的方法,即trainStation,这里method=sell()方法
Object obj = method.invoke(trainStation, args);
return obj;
}
}
);
return proxyObject;
}
}
四、使用方法
public class Client {
public static void main(String[] args) {
ProxyFactory factory = new ProxyFactory();
SellTickets proxyObject = factory.getProxyObject();
proxyObject.sell();
}
}
-------------------------------------------------------------
中间商赚差价--jdk
火车站卖票
五、执行流程
1.在测试类中通过代理对象调用sell()方法
2.factory.getProxyObject() 中 得到真正的代理类 ($Proxy0)
即 SellTickets proxyObject = $Proxy0
根据多态的特性,proxyObject .sell() 执行的是代理类代理类 ($Proxy0)中的sell()方法
3.代理类中的sell()方法中又调用了InvocationHandler接口的子实现类对象的invoke方法,即Proxy.newProxyInstance中的new InvocationHandler(){
@Override public Object invoke(){ //增强内容 }
}这个自己写的增强方法
4.invoko方法通过反射执行了真实对象所属类(TrainStation)中sell()方法