
Java动态代理3——阅读
创建一个 CGIb 代理类:这个类需要继承目标类,并通过动态生成子类进行方法代理。 创建一个 Enhancer 实例:Enhancer 用于生成目标类的动态代理类。 设置 Enhancer 的回调方法:通常,Enhancer 会设置方法拦截器,用于处理目标类的方法调用。 生成代理对象:通过 Enhancer 的 create 方法生成最终的代理实例。
发布日期:2025-04-02 01:16:55
浏览次数:11
分类:精选文章
本文共 2479 字,大约阅读时间需要 8 分钟。
Java 动态代理之 CGIb 实现方法
在前一篇文章《Java 动态代理之 JDK 动态代理》中,我们讨论了 JDK 的动态代理机制。对于那些需要实现动态代理但不符合 JDK 动态代理条件的场景,比如无法实现接口的类,CGIb 动态代理提供了一种灵活的解决方案。本文将详细介绍 CGIb 动态代理的工作原理及其实现方法,并通过实例进一步说明其应用场景。
CGIb 动态代理的原理
CGIb(Commons Generic Instrumentation Bridge)是一种基于 Java 反射机制的动态代理工具。与 JDK 动态代理不同,CGIb 动态代理能够为实现了或未实现接口的任何类创建代理。其实现原理是通过动态生成目标类的子类,从而覆盖目标类的方法。这种方法的优势在于,可以通过继承方式增强目标类的功能,但也因为是基于继承而存在局限性,比如不能代理修饰为 final 的类。
CGIb 动态代理的实现步骤
以下是使用 CGIb 实现动态代理的典型步骤:
需要注意的是,CGIb 动态代理的核心思想是在目标类的方法被调用时,动态地执行一些额外的逻辑。根据需要,可以通过设置 MethodInterceptor 来实现拦截逻辑。
动态代理示例
以下是一个使用 CGIb 动态代理的典型示例:
1. **定义接口 BookFacade**
```javapackage net.battier.dao;public interface BookFacade { void addBook();}```- 实现类 BookFacadeImpl1(本类没有实现接口 ложang 实现动态代理):
- 创建 CGIb 代理类 BookFacadeCglib:
- 测试类 TestCglib:
- 灵活性高:CGIb 动态代理能够为任何类(无论是否实现接口)创建代理。
- 继承方式增强:通过生成目标类的子类实现动态代理,适用于那些无法通过组合方式实现功能增强的场景。
- 性能影响:由于 CGIb 基于反射和 ASM 反编译器,其性能相比 JDK 动态代理略低,但在大多数应用场景下表现良好。
- 适用场景:CGIb 动态代理适用于需要对已有、不可修改的类(如第三方库)进行功能增强的情况。
package net.battier.dao.impl;public class BookFacadeImpl1 { public void addBook() { System.out.println("增加图书的普通方法..."); }}
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; }}
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 动态代理的特点
总之,CGIb 动态代理提供了一种灵活且强大的动态代理实现方案,适用于对传统 JDK 动态代理机制无法实现的场景。这两种动态代理机制各有优势,选择哪一种取决于具体的应用需求。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月17日 15时10分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Dva员工增删改查Demo实现-优化
2025-03-29
EasyUi的使用与代码编写(一)
2025-03-29
ECSHOP实现收货国家省市由选择下拉菜单改为手动
2025-03-29
ECShop模板原理
2025-03-29
edgeboxes proposal 和dpm 连接
2025-03-29
EdgeX Foundry:开启边缘计算新时代
2025-03-29
Educational Codeforces Round 28
2025-03-29
ed编辑器--适用于shell脚本内编辑文件的最最简单编辑器
2025-03-29
EF 资料
2025-03-29
Effective Modern C++:02auto
2025-03-29
efficientnet最合适的尺寸和最后一层的层数
2025-03-29
Ehcache Java开源缓存框架
2025-03-29
EhCache 分布式缓存/缓存集群
2025-03-29
EJB学习笔记六(EJB中的拦截器)
2025-03-29
el-form表单重置后输入失效
2025-03-29
el-select下拉框修改背景色
2025-03-29
el-table select事件判断当前项是否勾选
2025-03-29
Elasticsearch & Kibana & Filebeat开启SSL通信
2025-03-29
ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
2025-03-29