来了 -- cglib的原理和使用

107 阅读1分钟

cglib被用来生成代码,他可以实现由代码实现生成代码,也就是说你可以写一段代码,叫他生成另外一份代码。浅浅的说一下这个功能呢是借助于asm这个字节码处理框架。根据被代理的类生成一个子类用来实现动态代理,但是他只能代理没有呗final修饰的类或者方法。区别于jdk实现的动态代理他性能更好但是需要更大的内存,因为生成子类的时候比利用反射动态生成代理类的方式更复杂也需要更大的空间用来解析类中的个个部分。还有就是cglib可以代理没有事先接口的类。 接下来是使用的一个小demo奉上

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class TestCglibDemo implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();

    public Object getProxy(Class clazz) {
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("befor");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("after");
        return result;
    }

    public static void main(String[] args) {
        TestCglibDemo proxy = new TestCglibDemo();
        ProxyServiceImpl proxyService = (ProxyServiceImpl) proxy.getProxy(ProxyServiceImpl.class);
        String mm = proxyService.writeName("mm");
        System.out.println(mm);
    }
}