CGLIB --操作字节码


CGLIB包的介绍 (来自百度百科)

代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包
CGLIB是一个强大的高性能的 代码生成包。

它广泛的被许多AOP的 框架使用,例如 Spring AOP和dynaop,为他们提供方法的interception(拦截)。最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和 jMock是通过使用模仿(moke)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。
CGLIB包的底层是通过使用一个小而快的 字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包, 脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的 字节码。当然不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。


实例:
package reflect;

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 Cglib {
    public static void main(String ss[]) {
        test();
    }

    static void test() {
        while (true) {
            Enhancer e = new Enhancer();
            e.setSuperclass(OOMObject.class);// 要生成OOMObject类的子类
            e.setUseCache(false);
            e.setCallback(new MethodInterceptor() {// 设置callback,对原有对象的调用全部转为调用<span
                                                   // MethodInterceptor的intercept方法
                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                    System.out.println("Before invoke ");
                    Object result = proxy.invokeSuper(obj, args);
                    System.out.println("After invoke");
                    return result;
                }
            });
            OOMObject ee = (OOMObject) e.create();
            ee.test();
        }
    }

    static class OOMObject {
        public void test() {
            System.out.println("invokinginginginging....");
        }

    }
}


输出:

Before invoke
invokinginginginging....
After invoke
Before invoke
After invoke
Before invoke
invokinginginginging....
After invoke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值