目录
2.2、Project Structure -> Project
2.3、Project Structure -> Modules
4、分析com.darren.center.designpatterns.proxy.v9.$Proxy0
4.3、调用InvocationHandler h的invoke方法
1、开启代理class的保存选项
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles","true");
public class Tank implements Movable {
@Override
public void move() {
System.out.println("tank moving ……");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Tank tank = new Tank();
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles","true");
//类加载器 代理对象应该实现的接口 实现了invocationHandler的对象
Movable movable = (Movable) Proxy.newProxyInstance(Tank.class.getClassLoader(),
new Class[]{Movable.class},
new TimeProxy(tank)
);
movable.move();
}
}
class TimeProxy implements InvocationHandler {
Movable movable;
public TimeProxy(Movable movable) {
this.movable = movable;
}
public void before(){
System.out.println("start moving……");
}
public void after(){
System.out.println("start stopped!!!");
}
/**
*
* @param proxy 代理对象
* @param method 哪个方法
* @param args 方法需要的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理对象:" + proxy.getClass().getName());
before();
Object obj = method.invoke(movable, args);
after();
return obj;
}
}
interface Movable{
void move();
}
2、使用jdk11
2.1、Setting -> Java Compiler
2.2、Project Structure -> Project
2.3、Project Structure -> Modules
3、运行小程序,生成代理对象
4、分析com.darren.center.designpatterns.proxy.v9.$Proxy0
4.1、构造$Proxy0
将传进来的第三个参数赋值给InvocationHandler
4.2、获取Movable接口的move方法
4.3、调用InvocationHandler h的invoke方法
第一个参数就是代理对象this,第二个参数就是Movable接口的move方法,第三个参数就是调用move方法所需要的参数
版权声明:本文为axin1240101543原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。