现在的位置: 首页 > 综合 > 正文

关于JDK动态代理的理解

2018年01月16日 ⁄ 综合 ⁄ 共 977字 ⁄ 字号 评论关闭

今天下午认认真真的学习了一下JDK的动态代理,过程中遇到了一些不懂的东西,但是最后还算是想明白了,下面说说自己的理解。

JDK动态代理的过程:

1、实现一个接口(假如是IMyService),然后实现自己的类(也就是自己写业务的地方例如MyServiceImpl)。(个人觉得一定要用这种方式,就是一定要写一个接口,然后实现自己类,下面我会说为什么我是这么认为的?)

2、实现java.lang.reflect.InvocationHandler这个接口,里面有一个invoke的方法需要实现。

3、调用Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)方法返回一个对象。里面有三个参数,第一个是类加载器,第二个是我们自己定的接口的所有方法,第三个是我们第二步实现的一个handler。这一步返回的对象,强制的转化为IMyService对象(例如imyService,这个时候我们就可以用这个对象去调用我们自己的方法了)。

上面说到为什么说一定要写一个接口。因为用Proxy.netProxyInstance返回的对象,是直接转化为IMyService的,不是转为我们实现的类MyServiceImpl。这说明了什么?我猜,JDK在用这个方法的时候,就是动态的实现一个类,这个类实现IMyService接口,然后这个类只做了一件事情,就是调用第二步handler里的invoke方法。这就搞明了,为什么要传一个classLoader进去,为什么要传一些方法名进去,这两个参数都是实现新的类的。至于handler就是实现我们自己业务的。

然后再说说JDK的动态代理和cglib吧,曾在ibm的网上看到说cglib的效率比较高,当时不理解,因为那篇文章说cglib是静态代理,也就是在编译期间,就把类给改了。而jdk的动态代理是每次进来就生成一个,所以效率不高。初想还觉得是,但是细想,难道jdk的动态代理每次响应的时候,classLoader都装载一次?这是不可能的吧,因为classLoader它找到有这个类就不会装载了?难道jdk动态代理生成的新类,是找不到,或者没有名字的,所以每次都要重新装载??有知道的大大,可以告诉我一下,为什么cglib会效率高的?

抱歉!评论已关闭.