Cglib生成动态代理(有改动)

Cglib(Code Generation Library)动态代理 [对没有实现接口的普通类做代理]

1、概述:
Cglib是一个优秀的动态代理框架,它的底层使用ASM(JAVA字节码处理框架)在内存中动态的生成被代理类的子类。使用CGLIB即使被代理类没有实现任何接口也可以实现动态代理功能。但是不能对final修饰的类进行代理。

2、原理:
通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。
(JDK动态代理与CGLib动态代理均是实现Spring AOP的基础)

3、使用:
使用Cglib前需要导入以下两个jar文件:
asm.jar – Cglib的底层实现。
【cglib包的底层是使用字节码处理框架ASM来转换字节码并生成新的类,所以cglib包要依赖于asm包】
cglib.jar - Cglib的核心jar包

下面用一个例子说明Cglib的使用。
1) 目标类,或真实类

public class CglibRealObject {
    public void doSomething(){
        System.out.println("doSomething thing method in CglibRealObject");
    }
}

2)生成动态代理的类

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibDynamicProxy implements MethodInterceptor {

    private Object proxied;

    public Object getProxyInstance(Object proxied){
        this.proxied = proxied;

        //声明增强类实例
        Enhancer enhancer = new Enhancer();

        //设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
        enhancer.setSuperclass(this.proxied.getClass());

        //设置要代理的拦截器,回调函数,即一个方法拦截
        enhancer.setCallback(this);

        //创建代理对象 实例
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

        //在处理前做一些事情
        System.out.println("before doSomething method, do other things");

        methodProxy.invokeSuper(o,args);

        //在处理后最一些事情
        System.out.println("after doSomething method");

        return null;
    }
}

3)、测试类

public class CglibTest {

    public static void main(String[] args){

        //用new创建一个动态代理类
        CglibDynamicProxy proxy = new CglibDynamicProxy();

        //用这个动态代理类 生成 一个真实类的代理
        CglibRealObject realObject = (CglibRealObject) proxy.getProxyInstance(new CglibRealObject());

        //用这个返回值调用方法
        realObject.doSomething();
    }
}

输出结果为

before doSomething method, do other things
doSomething thing method in CglibRealObject
after doSomething method

原文地址:http://blog.csdn.net/janice0529/article/details/42884019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值