传统动态代理实现计算器类日志功能

1 接口

public interface Caculator {
    public int add(int op1, int op2);
    public int sub(int op1, int op2);
    public int mul(int op1, int op2);
    public int div(int op1, int op2);
}

2 日志工具类

/*
1 这个日志工具类用了反射的思维,有四个不同的方法对应着核心方法的四个重要的位置,
分别是运行前,运行后,被捕获到异常时(catch块内),结束时(fially代码块内)

2 	Utils工具类的方法通常都是静态的,方便调用
 */
public class LogUtils {
    public static void logStart(Method method,Object ...args){
        System.out.println("方法【"+ method.getName() +"】开始执行,调用的参数是:" + Arrays.asList(args));
    }

    public static void logReturn(Method method,Object result){
        System.out.println("【"+method.getName()+"】执行完毕" + "返回的结果是:" + result);
    }

    public static void logException(Method method,Exception e){
        System.out.println("【"+method.getName()+"】出现异常" + "异常的原因是:" + e.getCause());
    }

    public static void logAfter(Method method){
        System.out.println("【"+method.getName()+"】结束执行");
    }
}

3 CaculatorProxy动态代理类

/*
注意:customer才是我们真正要代理的对象,本例中是计算器类(MyCaculator类的对象),我们分别在
核心业务方法的四个位置运行前,运行后,被捕获到异常时(catch块内),结束时(fially代码块内)执行
logUtils的日志方法,打印相关日志信息
 */
public class CaculatorProxy {
    public static Object getProxy(Object customer) {
        Class clazz = customer.getClass();
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(customer);
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),handler);
    }
}

     class MyInvocationHandler implements InvocationHandler{
        Object customer;

        //和getProxy的参数对象进行绑定
        public void bind(Object customer){
            this.customer = customer;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = null;
            try {
                LogUtils.logStart(method,args);
                result = method.invoke(customer,args);
                LogUtils.logReturn(method,result);
            } catch (Exception e) {
                LogUtils.logException(method,e);
                e.printStackTrace();
            } finally {
                LogUtils.logAfter(method);
            }
            return result;
        }
    }

4、MyCaculator类

public class MyCaculator implements Caculator {
    @Override
    public int add(int op1, int op2) {
        return op1 + op2;
    }

    @Override
    public int sub(int op1, int op2) {
        return op1 - op2;
    }

    @Override
    public int mul(int op1, int op2) {
        return op1 * op2;
    }

    @Override
    public int div(int op1, int op2) {
        return op1 / op2;
    }
}

5 测试类

public class Client {
    public static void main(String[] args) {
        Caculator proxy = (Caculator) CaculatorProxy.getProxy(new MyCaculator());
        proxy.add(2,1);
        proxy.sub(2,1);
        proxy.div(2,1);
        proxy.sub(2,1);
    }
}

运行结果,完美实现日志打印功能
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值