Java静态代理和动态代理

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

你可能感兴趣的:(Java静态代理和动态代理)