JDK之动态代理

1、基本原理

1.1 原理描述:使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行

1.2 涉及技术:代理、反射

1.3 局限性:必须基于接口实现

2、实践

2.1 定义接口及实现类

public interface Say {
        void sayHello(String content);
        void run(String content);
    }

    static  class People implements Say {

        @Override
        public void sayHello(String content) {
            System.out.println(content);
        }

        @Override
        public void run(String content) {
            System.out.println(content);
        }
    }

2.2 jdk动态代理实现逻辑

public class JDKDynamicProxy {
    public static Object createProxy(final Object obj) {
        return Proxy.newProxyInstance(JdkProxyTest.class.getClassLoader(),obj.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                doBefore();
                if (method.getName().equals("sayHello")) {
                    method.invoke(obj,args[0]);
                    doAfter();
                }
                return null;
            }
        });
    }

    static void doBefore() {
        System.out.println("---before---");
    }

    static void doAfter() {
        System.out.println("---after---");
    }
}

2.3 测试动态代理

vm options:-verbose:class

    public static void main(String[] args) {
        Say p = new People();
        p = (Say) JDKDynamicProxy.createProxy(p);
        p.sayHello("liup");
        p.run("gogogo"); // 测试执行接口所有方法,都会拦截
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值