cglib 基础

一、概述

  cglib 是一个高效的、强大的字节码生成库,应用广泛(spring Aop)

二、cglib动态代理与jdk动态代理的比较

  •   jdk动态代理只能对实现了相应接口的类生成代理类,而cglib动态代理可以对任意类生成代理类(继承,实际为生成子类)
  •   cglib底层使用asm字节码框架,jdk动态代理使用java反射,理论上cglib更加高效

三、MethodInterceper 接口(类似于jdk动态代理中的InvocationHandler)

//所有被拦截方法调用该intercept方法,而不是直接调用原方法
public
Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable;

//obj 子类对象(被增强的对象)
//method 被拦截的方法(父类方法)
//args 被拦截方法参数
//proxy 子类方法,不会被拦截.一般用这个,而不用method对象(maybe死循环)

四、Enhancer类使用

  用于生成增强类,需要指定父类,以及方法拦截器

Enhancer e = new Enhancer();
e.setSuperClass(Bean.class);//填充需要被增强的类(父类)
e.setCallback(interceptor);//设置方法拦截器(此处对所有方法进行拦截)
Object bean = e.create();//生成被增强之后的对象
String name = bean.getClass().getSuperclass().getName();//这里name即为Bean.class(父类)的全限定名。
Method[] methods = bean.getClass().getMethods();//这里可以看到增强对象所包含的方法(并未覆盖父类的方法,方法名不一样)
Bean beanProxy = (Bean)bean;//向上转型。

五、小demo

  从以下demo可以看出 final方法和static方法不能被增强(从继承的角度也好理解的)

public class SimpleDemo {

    public void disPlay(){
        System.out.println(" superClass display");
    }
    public final void display2(){//final方法不会被增强
        System.out.println(" superClass display2");
    }
    public static void display3(){//static方法不会被增强
        System.out.println(" superClass display3");
    }
    public static Object newInstance(Class clazz){
        Enhancer e = new Enhancer();
        e.setSuperclass(clazz);
        e.setCallback(new MethodInterceptor() {
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("请求方法定义的类:" + method.getDeclaringClass() + "代理方法所属类:" + proxy.getClass());
                Object ret = proxy.invokeSuper(obj, args);
                System.out.println("方法执行结束");
                return ret;
            }
        });
        Object enhanceObject = e.create();
        System.out.println("增强类的父类:" + enhanceObject.getClass().getSuperclass().getName());
        Method[] methods = enhanceObject.getClass().getMethods();//此处可以调试看看
        return enhanceObject;
    }

    public static void main(String[] args) {
        SimpleDemo simpleDemo = (SimpleDemo) newInstance(SimpleDemo.class);
        simpleDemo.disPlay();
        simpleDemo.display2();
        simpleDemo.display3();
    }
}

  运行结果:

  

增强类的父类:net.sf.cglib.samples.SimpleDemo
请求方法定义的类:class net.sf.cglib.samples.SimpleDemo代理方法所属类:class net.sf.cglib.proxy.MethodProxy
 superClass display
方法执行结束
 superClass display2
 superClass display3

2018-10-22 22:55:39

猜你喜欢

转载自www.cnblogs.com/pepper-1996/p/9830752.html
今日推荐