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

jdk动态代理原理

时间:2017-04-15 20:10:04      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:throw   row   bin   参数传递   代理类   shm   包含   方法调用   实例化   

http://www.cnblogs.com/MOBIN/p/5597215.html   请先查看这边博文

     此文主要是在上篇博文的基础之上,宏观的理一下思路,因为之前本人看了上篇之后云里雾里(是本人技术不到位)。然后研究了一会儿jdk1.8的源码之后写了此篇,不是很准确,源码上篇博文之中已经很多了,我就不加了。

1 获取代理对象,需要传入类加载器,需要被实现的接口, InvocationHandler对象(该对象中,包含了我们自己编写的接口实现类实例,也就是未被代理的业务逻辑)
调用的是 Proxy类中的newProxyInstance(classloader,interfaces,invocationHandler)方法
2 newProxyInstance 方法调用 getProxyClass0(loader,interfaces);来获取代理类class对象,然后获取getConstructor(constructorParams)来获取构造方法,然后传入InvocationHandler对象来实例化代理对象并返回
3 getProxyClass0方法中主要实现的逻辑是,获取接口中的方法method(反射),将接口的包名全路径,方法名记录下来,在代理类中实现(通过字节码的方式,可以研究源码),通过static静态代码块的方式,将method通过反射的方式注入到代理类中m1,m2,m3等,同时还实现了equals,hashmap等方法,最后通过传入的InvocationHandler对象,来调用this.h.invoke(this, method, null); 方法 this就是代理类对象,method是通过静态注入获取到的method对象,是接口所定义的。
在我们实现的InvocationHandler对象中实现了如下方法
 
   @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println(“—– before —–“);
        Object result = method.invoke(target, args);
        System.out.println(“—– after —–“);
       return result;
   }

 

其中:proxy是代理类实例,method是接口中的方法对象,也是在代理类中实现的当前方法,是代理类实现接口方法的时候作为参数传递过来的,args是参数,方法没有入参则为null
method.invoke(target,args)是java反射中的方法.target是接口实现类的实例,method是接口定义的方法。

jdk动态代理原理

标签:throw   row   bin   参数传递   代理类   shm   包含   方法调用   实例化   

原文地址:http://www.cnblogs.com/daixinyu/p/6715375.html

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