欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
}