CGLIB-Spring的一种反射机制

Spring 在进行反射时候主要有两种策略,一种是直接用 JDK 的反射,另外是用 CgLib

cglib是一个开源项目, 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。cglib项目主页: http://cglib.sourceforge.net/

CgLib 底层用的 asm

Spring-CGLIB

Asm 是一个强大的 Java 字节码生成框架,和 BCEL 或者 SERP 很类似,但是小很多,可以动态修改 java 字节码 .

其中最核心的代码为

newProxyInstance (obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), InvocationHandler invocationHandler);

obj.getClass().getInterfaces() 可以看出,如果直接用 JDK 的反射需要创建接口,接口是用来搞架构的,但是对于非常非常小的项目去写接口有点麻烦。

CgLib 就可以不用接口,它底层调用 asm 动态生成一个代理类去覆盖父类中非 final 的方法,然后实现 MethodInterceptor 接口的 intercept 方法,这样以后直接调用重写的方法,比 JDK 要快。

但是加载 cglib 消耗时间比直接 jdk 反射时间长,开发的过程中,如果是反复动态生成新的代理类推荐用 jdk 自身的反射,反之用 cglib.

Spring Bean 工厂中有一个方法

public void setOptimize (boolean optimize)- 是否使用 CGLIB 代理优化策略 . 仅用于 CGLIB
代理 ; 对于 JDK 动态代理 ( 缺省代理 ) 无效 .


下面是一个 demo( HelloWorld

Jar : cglib-2.2.jar, asm-all-3.1

Helloworld 方法

代理类

测试类

Cglib 使用起来学习路线还是很低的

原理是实现 MethodInterceptor 这个接口

System.out.println("Before Helloworld~");

methodProxy.invokeSuper(object, args);

System.out.println("After Helloworld~");

这里就是 AOP 的思想

然后去装载的时候先要生成一个 Enhancer

这个类的作用是先设定被代理类

enhancer.setSuperclass(HelloWorld.class);

然后实例化代理类

enhancer.setCallback(new CglibProxy());

HelloWorld helloWorld = (HelloWorld) enhancer.create();

这样被调用的类就是被 asm 动态改变改变后的类

 

原文地址:http://blog.csdn.net/mini_snow/archive/2009/08/03/4404558.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值