【知识积累】JDK动态代理的代理对象

目录

 

1、开启代理class的保存选项

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

4.2、获取Movable接口的move方法

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版权协议,转载请附上原文出处链接和本声明。