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

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,args);
            } catch (Exception e) {
    
    
                LogUtils.logException(method,e);
                e.printStackTrace();
            } finally {
    
    
                LogUtils.logAfter(method);
            }
            return result;
        }
    }

4MyCaculator类

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);
    }
}

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

猜你喜欢

转载自blog.csdn.net/wwwwwww31311/article/details/113584401
今日推荐