java中的代理

来源:互联网 发布:linux ssh2 编辑:程序博客网 时间:2024/06/16 19:19

JDK提供的代理(动态代理)

核心是InvocationHandler和Proxy。具体方法为,对要设置代理的类,扫描其类对象,获取所有实现的接口,然后根据这些接口新建一个实现了被代理类所有接口的代理类(用java代码创建新的java类的字节码然后加载)。在代理类中,所有实现接口的方法都采用反射的方式调用被代理类中的代码。

特点:

  • 创建方便快速
  • 采用反射调用,由一定的性能消耗
  • 被代理类一定要实现接口!!!

应用:
SPRING AOP
JAVA MOCKITO

CGLIB提供的代理(动态代理)

cglib是一个第三方jar包。他同样采取了字节码技术,方法是利用ASM这个第三方字节码编辑框架,读取被代理类的字节码,然后根据该字节码创建一个被代理类的子类(代理类)。并在子类中完成对被代理类方法的拦截和增强。

特点:

  • 可以代理没有实现接口的类
  • 生成代理类比较慢,但是执行代理类非常快。

应用
SPRING框架

ASPECTJ(静态代理)

在java代码编译器完成代理

  • 需要aspectj的编译器