动态代理Proxy和Cglib

 大概过程

 程序运行期间动态生成字节码文件,然后加载到内存里面,生成代理对象

 静态代理的时候,代理类和被代理类必须实现同一个接口,

 动态代理代码

public class MyCalculator implements Calculator{

    @Override
    public int add(int i, int j){
        int result = i + j;
        return result;
    }

    @Override
    public int sub(int i, int j){
        int result = i - j;
        return result;
    }

    @Override
    public int mul(int i, int j){
        int result = i * j;
        return result;
    }

    @Override
    public int div(int i, int j){
        int result = i / j;
        return result;
    }
}

public class CalculatorProxy{
    public static Calculator getProxy(){
        // 获取类加载器
        ClassLoader classLoader = calculator.getClass().getClassLoader();
        // 获取要实现的接口
        Class<?> interfaces = calculator.getClass().getInterfaces();
        InvocationHandler h = new InvocationHandler(){
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
                try{
                    Object result = method.invoke(calculator, args);
                    return result;
                }catch(Exception e){
                    e.printStackTrace();
                }                
            }
        }
        Proxy.newProxyInstance();
    }
}

public class Test{
    public static void main(String[] args){
        Calculator proxy = CalculatorProxy.getProxy(new MyCalculator());
        System.out.println(proxy.add(1,1));
        System.out.println(proxy.getClass());
    }
}

 ASM是Java字节码操控框架,动态生成类或增强既有类的功能

 ASM可以直接产生二进制class文件,可以在类被加载前动态改变类的行为

 CGlib

public class MyCalculator{

    public int add(int i, int j){
        int result = i + j;
        return result;
    }
    
    public int sub(int i, int j){
        int result = i - j;
        return result;
    }

    public int mul(int i, int j){
        int result = i * j;
        return result;
    }

    public int div(int i, int j){
        int result = i / j;
        return result;
    }
}

public class MyCglig implements MethodInterceptor{
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{
        System.out.println("输出前");
        Object o = proxy.invokeSuper(obj, args);
        System.out.println("输出后");
        return o;
    }
}

public class Test{
    public static void main(String[] args){
        // 动态代理创建的class文件存储到本地
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "d:\code");
        // 创建cglib获取代理对象的操作对象
        Enhancer enhancer = new Enhancer();
        // 设置enhancer对象的父类
        enhancer.setSuperclass(MyCalculator.class);
        // 设置enhancer的回调对象
        enhancer.setCallback(new MyCglib());
        // 创建代理对象
        Object o = enchancer.create();
        MyCalculator MyCalculator = (MyCalculator)enhancer.create();
        MyCalculator.add(1, 1);
        System.out.println(MyCalculator.getClass());        
    }
}
原文地址:https://www.cnblogs.com/YC-L/p/14240478.html