JDK动态代理的简单实例
程序员文章站
2022-04-19 16:31:55
...
JDK动态代理理解
public class Main_ProxyJDK {
public static void main(String[] args) {
Tank tank = new Tank();
// 设置保存jdk生成的代理类
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles","true");
// Proxy的newProxyInstance的方法的参数是:第一个:加载器,一般为被代理类的的加载器
// 第二个:jdk代理必须有接口,就是代理对象实现的接口可以多个
// 第三个:实现InvocationHandler接口的匿名类部类,或者可以实现InvocationHandler接口的类
// InvocationHandler的invoke方法的参数,第一个是生成的代理对象,第二个是方法的对象,第三个是参数
// 一般第一个参数我们不会用,因为我们会直接在invoke方法里面写我们的代理逻辑,不需要,调用代理对象的方法
// 具体实现逻辑,可以看动态生成的代理对象$Proxy0.class
Moveable proxyInstance = (Moveable) Proxy.newProxyInstance(Tank.class.getClassLoader(),
new Class[]{Moveable.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理开始了");
Object o = method.invoke(tank, args);
System.out.println("代理结束了....");
return o;
}
});
proxyInstance.move();
}
}
/**
* @author fdy
* @date 2021/2/17 9:19
* 被代理类
* @return {@link null}
*/
class Tank implements Moveable {
@Override
public void move(){
System.out.println("=============");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
interface Moveable{
void move();
}
上一篇: JDK动态代理实现原理(含实例)
下一篇: 动态代理-JDK动态代理