Java静态代理: 其实就是设计模式中的一种; 如下图所示:
Java静态代理静态代理的缺点:
Proxy类其实没有实际的内容,它只是实现了相同的接口,所有的请求都是代理到realSubject对象来处理。 如果系统中需要代理的类比较多,会导致系统内的类的数量增多,系统结果比较臃肿和松散。
Java动态代理:
在Java代码的运行时动态的创建这个proxy对象,当这个proxy对象生命周期结束的时候自动回收。这样就避免了静态代理的大量的冗余类的问题了。
Java动态代理实现的两种方式:
1)JDK自带的动态代理方式; 要求被代理的类必须有接口实现;
这种方式的底层是使用反射来实现的。
2)使用CGLIB来实现动态代理; 不要求类必须实现接口; 只要方法不是final的就可以;
cglib的使用还是非常简单的,如下图:
CGLIB的使用示例CGLIB的底层是通过ASM字节码操纵工具来实现的。
常见的字节码操纵工具有:
a)asm : 比较底层,基本上是通过JVM的汇编指令来操作的; 需要对class文件结果比较了解。
b)javassist : 使用起来比较简单。
c)BCEL
网友评论