cglib 代理

cglib 代理

什么是cglib?

  一段介绍是这样的:

      CGLIB(Code Generation Library)是一个开源项目!

      是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。

      CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。

      Spring AOP和Hibernate同时使用JDK的动态代理和CGLIB包。

cglib 代理特点:

CGLIB 是针对类来实现代理,它的原理是对指定的目标类生成一个子类,并覆盖其中方法。

因为采用的是继承,所以不能对 finall 类进行继承。

需要用到两个jar: cglib 和 asm

实例:

1、一个Hello 类,是目标对象

/** 没有接口的类
 * Created by hp on 14-7-27.
 */
public class Hello {

    public void sayHello() {
        System.out.println("Hello ,world");
    }
}

2、代理类CglibProxy,

/**  Cglib 动态代理
 * Created by hp on 14-7-27.
 */
public class CglibProxy implements MethodInterceptor {

    private Object object;

    /* 创建代理对象
     * @param object
     * @return
     */
    public Object getProxyInstance(Object object) {
        this.object = object;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(object.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }


    @Override
    public Object intercept(Object obj, Method method,
                            Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("哥去买包烟先,再帮你打包");
        Object result = method.invoke(object, args);
        System.out.println("垃圾太多了,倒掉吧");
        return result;
    }
}

3、客户端调用

CglibProxy cglibProxy = new CglibProxy();
        Hello hello = (Hello)cglibProxy.getProxyInstance(new Hello());
        hello.sayHello();
原文地址:https://www.cnblogs.com/pan2011/p/3871309.html