博客
关于我
JAVA动态代理简单总结
阅读量:803 次
发布时间:2023-01-28

本文共 3198 字,大约阅读时间需要 10 分钟。

JDK与CGILB动态代理实现对比

JDK和CGILB两种动态代理实现方式各有特点,了解其实现机制对于开发有重要意义。本文将从 InvocationHandler 与 Proxy(JDK实现)、MethodInterceptor 与 Enchancer(CGILB实现)两个方面进行对比分析。

JDK动态代理实现

InvocationHandler 与 Proxy

JDK动态代理的核心组件包括 InvocationHandlerProxy

Proxy 组件

Proxy 是动态代理的核心实现类,主要负责根据指定接口生成动态代理类。 Proxy 类提供了两个重要方法:

  • Proxy.newProxyInstance:用于根据指定的接口生成动态代理对象。

    • 参数解析:
      • loader:类加载器,负责生成代理类所需的类加载。
      • interfaces:接口数组,指定需要代理接口。
      • handler:InvocationHandler 实例,负责调用目标方法。
  • InvocationHandler 接口:定义了动态代理的逻辑处理方法。

    • invoke 方法核心逻辑:
      • 接收调用参数(代理对象、方法和参数数组)。
      • 调用目标方法(通过反射 API)。
      • 可自定义处理前后逻辑。
  • 代理生成流程 (以 JDK 为例)

  • 定义目标类:实现需代理的接口。
  • 创建 InvocationHandler:关联代理逻辑(如调用前后处理)。
  • 调用 Proxy.newProxyInstance:生成代理对象。
  • 属性逐步解析
    • ClusterLoader:控制哪个类加载器加载代理类。
    • Interface[]:传递目标接口。
    • InvocationHandler:决定每次方法调用怎么处理。
  • 代理对象使用示例

    // 目标类interface Subject {    void rent();    void hello(String str);}class RealSubject implements Subject {    @Override    void rent() { System.out.println("I want to rent my house"); }    @Override    void hello(String str) { System.out.println("hello: " + str); }}// 动态代理接口实现class DynamicProxy implements InvocationHandler {    private RealSubject subject;    constructor RealSubject subject) { this.subject = subject; }    @Override    public Object invoke(Object object, Method method, Object[] args) {        System.out.println("调用前:" + method.getName());        method.invoke(subject, args);        System.out.println("调用后");         return null;    }}// 创建代理Subject subjectProxy = Proxy.newProxyInstance(    DynamicProxy.class.getClassLoader(),    RealSubject.class.getInterfaces(),    new DynamicProxy(new RealSubject()));

    测试输出示例

    调用代理对象 method:

    Proxy0before rent houseMethod: public abstract void com.xiaoluo SUBJECT rent ()I want to rent my houseafter rent housebefore rent houseMethod: public abstract void com.xiaoluo SUBJECT hello (java.lang.String)hello: worldafter rent house

    JDK动态代理特点

    • 动态生成代理对象,基于反射机制实现。
    • 目标类需实现特定的接口。
    • 透明度高,可通过反射观察代理逻辑。

    CGILB 动态代理实现

    区别与特点

    CGILB 与 JDK 的主要区别:

  • 无需接口实现要求:"@-target"类不需要实现特定接口,可直接进行方法拦截。
  • 继承增强:生成代理类继承目标类,非final方法可重写。
  • 效率更高:基于类操作,性能优于反射实现。
  • CGILB 代理实现流程

  • 导入必要库

    • cglib-nodep-2.2.jar(无需_asm.jar包)
    • cglib-2.2.jar(需配合_asm.jar包使用)
  • 开发拦截器类:实现 MethodInterceptor 接口。

  • 例子:TargetInterceptor 拦截器

    import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class TargetInterceptor implements MethodInterceptor {    @Override    public Object intercept(Object obj, Method method, Object[] params,                          MethodProxy proxy) throws Throwable {        System.out.println("拦截前:" + method.getName());        Object result = proxy.invokeSuper(obj, params);        System.out.println("拦截后:" + result);        return result;    }}
    1. 创建动态代理
      // 定义类型对象public static final TargetObject TARGET_OBJECT = new TargetObject();// 实现 EnhancerEnhancer enhancer = new Enhancer();enhancer.setSuperclass(TARGET_OBJECT.getClass());enhancer.setCallback(new TargetInterceptor());TARGET_OBJECT = enhancer.create();// 调用方法System.out.println(TARGET_OBJECT.method1("mmm1"));System.out.println(TARGET_OBJECT.method2(100));System.out.println(TARGET_OBJECT.method3(200));
    2. ---## 动态代理的核心选型- **选择 JDK 动态代理**:如果目标对象已实现特定接口,且对动态代理的逻辑要求较为基础。- **选择 CGILB 动态代理**:如果需要更灵活的方法拦截,而目标对象无需实现接口,或需对方法执行过程增强功能。

    转载地址:http://fnryk.baihongyu.com/

    你可能感兴趣的文章
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
    查看>>