博客
关于我
Java动态代理3——阅读
阅读量:794 次
发布时间:2023-01-28

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

Java 动态代理之 CGIb 实现方法

在前一篇文章《Java 动态代理之 JDK 动态代理》中,我们讨论了 JDK 的动态代理机制。对于那些需要实现动态代理但不符合 JDK 动态代理条件的场景,比如无法实现接口的类,CGIb 动态代理提供了一种灵活的解决方案。本文将详细介绍 CGIb 动态代理的工作原理及其实现方法,并通过实例进一步说明其应用场景。

CGIb 动态代理的原理

CGIb(Commons Generic Instrumentation Bridge)是一种基于 Java 反射机制的动态代理工具。与 JDK 动态代理不同,CGIb 动态代理能够为实现了或未实现接口的任何类创建代理。其实现原理是通过动态生成目标类的子类,从而覆盖目标类的方法。这种方法的优势在于,可以通过继承方式增强目标类的功能,但也因为是基于继承而存在局限性,比如不能代理修饰为 final 的类。

CGIb 动态代理的实现步骤

以下是使用 CGIb 实现动态代理的典型步骤:

  • 创建一个 CGIb 代理类:这个类需要继承目标类,并通过动态生成子类进行方法代理。
  • 创建一个 Enhancer 实例:Enhancer 用于生成目标类的动态代理类。
  • 设置 Enhancer 的回调方法:通常,Enhancer 会设置方法拦截器,用于处理目标类的方法调用。
  • 生成代理对象:通过 Enhancer 的 create 方法生成最终的代理实例。
  • 需要注意的是,CGIb 动态代理的核心思想是在目标类的方法被调用时,动态地执行一些额外的逻辑。根据需要,可以通过设置 MethodInterceptor 来实现拦截逻辑。

    动态代理示例

    以下是一个使用 CGIb 动态代理的典型示例:

    1. **定义接口 BookFacade**

    ```javapackage net.battier.dao;public interface BookFacade { void addBook();}```
    1. 实现类 BookFacadeImpl1(本类没有实现接口 ложang 实现动态代理):
    2. package net.battier.dao.impl;public class BookFacadeImpl1 {    public void addBook() {        System.out.println("增加图书的普通方法...");    }}
      1. 创建 CGIb 代理类 BookFacadeCglib
      2. package net.battier.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class BookFacadeCglib implements MethodInterceptor {    private Object target;    public Object getInstance(Object target) {        this.target = target;        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(target.getClass());        enhancer.setCallback(this);        return enhancer.create();    }    @Override    public Object intercept(Object obj, Method method, Object[] args,            MethodProxy proxy) throws Throwable {        System.out.println("事物开始");        proxy.invokeSuper(obj, args);        System.out.println("事物结束");        return null;    }}
        1. 测试类 TestCglib
        2. package net.battier.test;import net.battier.dao.impl.BookFacadeImpl1;import net.battier.proxy.BookFacadeCglib;public class TestCglib {    public static void main(String[] args) {        BookFacadeCglib cglib = new BookFacadeCglib();        BookFacadeImpl1 bookCglib = (BookFacadeImpl1) cglib.getInstance(new BookFacadeImpl1());        bookCglib.addBook();    }}

          总结 CGIb 动态代理的特点

        3. 灵活性高:CGIb 动态代理能够为任何类(无论是否实现接口)创建代理。
        4. 继承方式增强:通过生成目标类的子类实现动态代理,适用于那些无法通过组合方式实现功能增强的场景。
        5. 性能影响:由于 CGIb 基于反射和 ASM 反编译器,其性能相比 JDK 动态代理略低,但在大多数应用场景下表现良好。
        6. 适用场景:CGIb 动态代理适用于需要对已有、不可修改的类(如第三方库)进行功能增强的情况。
        7. 总之,CGIb 动态代理提供了一种灵活且强大的动态代理实现方案,适用于对传统 JDK 动态代理机制无法实现的场景。这两种动态代理机制各有优势,选择哪一种取决于具体的应用需求。

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

    你可能感兴趣的文章
    2024年全球顶尖杀毒软件,从零基础到精通,收藏这篇就够了!
    查看>>
    2024年度“金智奖”揭晓:绿盟科技获双项大奖,创新驱动网络安全新高度。从零基础到精通,收藏这篇就够了!
    查看>>
    2024年最流行的十大开源渗透测试工具
    查看>>
    2024年网络安全八大前沿趋势,零基础入门到精通,收藏这篇就够了
    查看>>
    2024年薪酬最高的五个网络安全职位,零基础入门到精通,收藏这一篇就够
    查看>>
    2024年非科班的人合适转行做程序员吗?
    查看>>
    2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了!
    查看>>
    2024最新最全CTF入门指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2024最新科普什么是大模型?零基础入门到精通,收藏这篇就够了
    查看>>
    2024最新程序员接活儿搞钱平台盘点
    查看>>
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2024版最新SRC漏洞挖掘思路手法(非常详细),零基础入门到精通,收藏这一篇就够了
    查看>>
    2024版最新渗透测试零基础入门教程,带你入门到精通(超详细),收藏这篇就够了
    查看>>
    2024版最新网络安全入门必备读书清单(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    2024版最新网络安全教程从入门到精通,看完这一篇就够了
    查看>>
    2024网络安全岗就业前景如何?零基础入门到精通,收藏这篇就够了
    查看>>
    2024零基础如何入门网络安全?
    查看>>
    2024,java开发,已经炸了吗?
    查看>>
    2025入门黑客技术必读书籍(非常全面)带你从小白进阶大佬!收藏这一篇就够了
    查看>>
    2025入门黑客技术必读书籍(非常全面)带你从小白进阶大佬!收藏这篇就够了
    查看>>