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);
}
}
运行结果,完美实现日志打印功能