Java动态代理

 

动态代理是代理模式的实现,在程序运行时,运用反射机制动态创建而成。Java动态代理是Java语言世界的动态代理。

为了更好地理解动态代理,我们先讲述一下代理模式。

代理模式一种软件设计模式, 是代理类与委托类有同样的接口。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

如下面代理模式比较通用的类图,Proxy是代理类,RealSubject是目标类,它们实现了同样的接口。也就是说Proxy类可以用在RealSubject使用的地方。

 image_thumb3

动态代理相比静态代理的不同在于:静态代理是由程序员创建或特定工具自动生成源代码,再对其编译,在程序运行前,代理类就已经存在了。在Java程序中,也就是代理类的.class文件就已经存在了。 而动态代理的代理类是在程序运行时,运用反射机制动态创建而成。

Java动态代理的两种实现:JDK动态代理和CGLib动态代理

  • JDK 动态代理

JDK动态代理是Java 原生的动态代理方法,不需要依赖任何第三方库。通过java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来动态生成代理类。该方法有三个参数:
       loader: 加载代理类的ClassLoader
       interfaces: 代理类代理的目标类的接口
       h:代理类的拦截器,通过定义实现InvocationHandler接口的类来实现自己的拦截器。

生成的代理类,类名如$ProxyXXX。如下面类图, 代理类$ProxyXXX继承java.lang.reflect.Proxy,并实现一个或者多个目标类的接口。在java.lang.reflect.Proxy类中有一个InvocationHandler类型的属性h,表示用户定义的拦截器。MyInvocationHandler是我们自定义的一个拦截器,其中有一个myTargetObject属性表示目标对象(这个不是必须的,但如果需要代理对象,我们可以将代理对象放在这),还有一个invoke方法,该方法是覆盖了接口中的invoke方法,当调用代理类的方法时,会调用拦截器的invoke方法。
     

Main_thumb1

  • CGLib 动态代理

CGLib 动态代理是通过使用一个小而快的字节处理框架ASM(Java字节码操控框架)来转换字节码并生成动态代理需要的类。CGLib除了生成我们需要的代理类,还会生成一些辅助类。

生成的代理图如下面类图,ObjectClass是我们的目标类,ObjectClass$$EhanceByCGLib$$****是动态生成的代理类,其中有CGLib$CALLBACK_X属性是拦截器。MyMethodInterceptor是我们自己实现的拦截器,其中有一个targetObject属性是代理的目标对象(这个不是必须的,但如果需要代理对象,我们可以将代理对象放在这)。而intercept方法是覆盖的MethodIntercepter的方法, 当调用代理类的方法时,会调用拦截器的intercept 方法。

ClassDiagram1_thumb2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值