码迷,mamicode.com
首页 > 其他好文 > 详细

jdk动态代理

时间:2020-03-05 23:38:18      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:ati   main   onclick   字节码   col   code   eth   this   click   

jdk实现的动态代理只能是基于接口的;即被代理的对象

生成动态代理的类:

技术图片
public class ProxyTool {

    /**
     *  需要被代理的类
     */
    private Object obj;
    public ProxyTool(Object obj){
        this.obj = obj;
    }

    /**
     * Proxy.newProxyInstance()方法有三个参数:
     * ClassLoader:用于加载代理对象的字节码,与被代理对象的类加载器保持一致,固定写法
     * Class[]:字节码数据,用于让代理类与被代理类有相同的方法,固定写法
     * InvocationHandler: 用于提供增强的代码,InvocationHandler接口中有一个方法 invoke()
     *
     *
     * invoke中有三个参数:
     * proxy:代理对象
     * method:当前执行的方法
     * args:当前执行方法的参数
     * @return
     */
    public Object getProxy(){
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
                       //写增强代码的地方
                        System.out.println("动态代理生效");
                        return method.invoke(obj,args);
                    }
                });

    }
}
View Code

测试方法:

技术图片
public class Main {
    public static void main(String[] args) {
        //被代理对象
        IProxyImpl proxy1 = new IProxyImpl();
        //代理工具
        ProxyTool ProxyTool = new ProxyTool(proxy1);
        //获取到代理类,这个地方只能强转为接口,强转为实现类会报错
        IProxy proxy = (IProxy)ProxyTool.getProxy();

        //执行方法
        proxy.print();
    }
}
View Code

 

jdk动态代理

标签:ati   main   onclick   字节码   col   code   eth   this   click   

原文地址:https://www.cnblogs.com/zhaolei1996/p/12423837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!