Java代理-JAVA动态代理,CGLIB动态代理

入职加上之前实习的时间快2个月了。学习到了很多的知识,但是在这个过程中也遇到了很多的困难。现在还在担心此后转正的问题。在学生阶段由于主要是做理论研究的,故在工程能力这一块优点欠缺。这一周,我刚刚被分到了其他的组,面对要离开之前带我老师,当时很激动,太囧了。行了,之前的算着一个小的日记,下面开始对之前的内容进行补充和完善。

代理分类

  1. 静态代理
  2. 动态代理( jdk动态代理,cglib,asm,javaassit)

静态代理

更多是一个设计模式
1、创建一个接口
2、创建一个接口的实现类
3、创建一个代理类,这个代理类也实现了上边的接口,但是将 要被代理的实现类传入到代理类中,在代理类的接口实现方法中调用,并在调用前后加上一些操作(上边的就是日志操作而已)

动态代理

JDK动态代理

  1. 需要接口
  2. 第二性能影响,因为动态代理使用反射的机制实现的,首先反射比直接调用要慢,经过测试大概每个代理类比静态代理多出10几毫秒的
  3. 生成新的类字节码文件。寄存在JVM的方法区中
    如果大量代理,JVM 方法区存放了类的相关信息.当加载到方法区的class太多的时候就可能会报出permgen溢出的错误。所以perm参数要适当调高,以免PERM去满的时候,频繁引起FULL-GC。(spring容器sington不会反复FULL-GC,但是会有OOM)

cglib动态代理(spring,powermock)

使用动态字节码增强,实现AOP。原理是在运行期间目标字节码加载后,将切面逻辑织入到新类中。一般选择继承delegate对象,所以使用cglib实现AOP不需要基于接口。
优点
使用动态字节码增强,实现AOP。原理是在运行期间目标字节码加载后,将切面逻辑织入到新类中。一般选择继承delegate对象,所以使用cglib实现AOP不需要基于接口。

你可能感兴趣的:(Java代理-JAVA动态代理,CGLIB动态代理)