动态代理模式

本文介绍了如何使用Java动态代理技术创建一个代理类,代理对象能够记录并打印出方法调用的日志,包括方法名、参数和返回结果。通过创建一个实现了ArithmeticCalculator接口的代理类MyProxy,实现代理功能,并在测试中展示了代理对象如何调用实际业务方法并打印相应日志。
摘要由CSDN通过智能技术生成

动态代理

步骤:1.先创建一个被代理对象的接口和实现类
public interface ArithmeticCalculator {
    /**
     * 加法运算
     * @param a
     * @param b
     * @return
     */
    int add(int a ,int b);
    /**
     * 减法运算
     * @param a
     * @param b
     * @return
     */
    int sub(int a ,int b);
    /**
     * 乘加法运算
     * @param a
     * @param b
     * @return
     */
    int mul(int a ,int b);
    /**
     * 除加法运算
     * @param a
     * @param b
     * @return
     */
    int div(int a ,int b);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~实现类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Component
public class ArithmeticCalculatorImpl implements ArithmeticCalculator{
    @Override
    public int add(int a, int b) {
        int c=a+b;
        return c;
    }

    @Override
    public int sub(int a, int b) {
        int c=a-b;
        return c;
    }

    @Override
    public int mul(int a, int b) {
        int c=a*b;
        return c;
    }

    @Override
    public int div(int a, int b) {
        int c=a/b;
        return c;
    }
}

2.创建代理类
public class MyProxy {
    //目标对象 (不确定被代理对象是什么类型 所以用Object 最后转型)
    private Object target;
    //构造方法
    public MyProxy(Object target) {
        this.target = target;
    }
    //得到代理对象
    public Object getInstance(){
        //ClassLoader loader 被代理对象的加载器
        ClassLoader loader = target.getClass().getClassLoader();
        //Class<?>[] interfaces 被代理对象实现的接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //InvocationHandler h 被代理对象的哪些行为被代理
        InvocationHandler h=new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method.getName()+","+ Arrays.asList(args));//打印日志 方法的名字和传入的参数
                Object result = method.invoke(target, args);
                System.out.println(method.getName()+","+result);//打印日志 运算结果
                return result;
            }
        };
        return Proxy.newProxyInstance(loader,interfaces,h);
    }
}
3.测试
 public static void main(String[] args) {
        ArithmeticCalculatorImpl arithmeticCalculator = new ArithmeticCalculatorImpl();//创建被代理对象
        MyProxy myProxy = new MyProxy(arithmeticCalculator); //代理人
        ArithmeticCalculator proxyInstance = (ArithmeticCalculator) myProxy.getInstance(); //得到代理对象
        int add = proxyInstance.add(10, 2); //调用方法
        System.out.println(add);
    }
结果 如图

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值