动态代理

375 阅读1分钟

1.cglib基本概念

Cglib 代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目
标对象功能的扩展.CGLib采用了非常底层的字节码技术,其原理是通过字节码
技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的
调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对 final 
修饰的类进行代理。JDK 动态代理与 CGLib 动态代理均是实现 Spring AOP 
的基础。

2.cglib示范案列

https://www.cnblogs.com/monkey0307/p/8328821.html#autoid-0-0-0可参考
    public class PersonService {
    public PersonService() {
        System.out.println("PersonService构造");
    }
    //该方法不能被子类覆盖
    final public Person getPerson(String code) {
        System.out.println("PersonService:getPerson>>"+code);
        return null;
    }

    public void setPerson() {
        System.out.println("PersonService:setPerson");
    }
}
public class CglibProxyIntercepter implements MethodInterceptor {
    @Override
    public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行前...");
        Object object = methodProxy.invokeSuper(sub, objects);
        System.out.println("执行后...");
        return object;
    }
}
public class Test {
    public static void main(String[] args) {        //代理类class文件存入本地磁盘
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(PersonService.class);
        enhancer.setCallback(new CglibProxyIntercepter());
        PersonService proxy= (PersonService)  enhancer.create();        proxy.setPerson();        proxy.getPerson("1");     
        
    }
}
执行前...
PersonService:setPerson
执行后...
PersonService:getPerson>>1

3.jdk示范案例

public class ProxyFactory implements InvocationHandler {

    private Class target;

    public <T>T getProxy(Class<T> c)  {
        this.target = c;
        return (T)Proxy.newProxyInstance(c.getClassLoader(),c.isInterface()?new Class[]{c}:c.getInterfaces(),this);
    }


    @Override
    public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
        System.out.println("代理执行执行");
        if ( !target.isInterface() ){
            method.invoke(target.newInstance(),args);
        }
        return "代理返回值";
    }

    public static void main(String[] args) {
        // 保存生成的代理类的字节码文件
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
        ProxyFactory proxyFactory = new ProxyFactory();
        IProx proxyImpl = proxyFactory.getProxy(ProxImpl.class);
        String result = proxyImpl.hello("hello word");
        System.out.println(result);
        System.out.println("---------");
        IProx proxy = proxyFactory.getProxy(IProx.class);
        result = proxy.hello("hello word");
        System.out.println(result);
    }
}

interface IProx{
    String hello(String id);
}
class ProxImpl implements IProx{

    @Override
    public String hello(String id) {
        System.out.println(id);
        return null;
    }
}