首先看
CalCulator接口
package com.spring.aop;
import javax.swing.JInternalFrame;
public interface CalCulator {
int add(int i,int j);
int sub(int i,int j);
int mul(int i,int j);
int div(int i,int j);
}
CalCulatorLoggingImpl实现类,
如果要你给每个方法都加上日志,好在执行的时候知道调用了哪个方法、什么参数和什么结果
package com.spring.aop;
public class CalCulatorLoggingImpl implements CalCulator {
@Override
public int add(int i, int j) {
// TODO Auto-generated method stub
System.out.println("The method add begins with["+i+","+j+"]");
int result=i+j;
System.out.println("The method add ends with"+result);
return result;
}
@Override
public int sub(int i, int j) {
// TODO Auto-generated method stub
System.out.println("The method sub begins with["+i+","+j+"]");
int result=i-j;
System.out.println("The method sub ends with"+result);
return result;
}
@Override
public int mul(int i, int j) {
// TODO Auto-generated method stub
System.out.println("The method mul begins with["+i+","+j+"]");
int result=i*j;
System.out.println("The method mul ends with"+result);
return result;
}
@Override
public int div(int i, int j) {
// TODO Auto-generated method stub
System.out.println("The method div begins with["+i+","+j+"]");
int result=i/j;
System.out.println("The method div ends with"+result);
return result;
}
}
运行主类
package com.spring.aop;
public class Main {
public static void main(String[] args) {
CalCulator culator=null;
culator=new CalCulatorLoggingImpl();
/*CalCulator target=new CalCulatorImpl();
CalCulator proxy=new CalCulatorLoggingProxy(target).getLoggingProxy();*/
int result=culator.add(1, 2);
System.out.println("-->"+result);
result=culator.div(4, 2);
System.out.println("-->"+result);
}
}
应该要把日志提取出来,让它重复使用。这里用到动态代理:
一个不用写日志的实现接口的类:
package com.spring.aop;
public class CalCulatorImpl implements CalCulator {
@Override
public int add(int i, int j) {
// TODO Auto-generated method stub
int result=i+j;
return result;
}
@Override
public int sub(int i, int j) {
// TODO Auto-generated method stub
int result=i-j;
return result;
}
@Override
public int mul(int i, int j) {
// TODO Auto-generated method stub
int result=i*j;
return result;
}
@Override
public int div(int i, int j) {
// TODO Auto-generated method stub
int result=i/j;
return result;
}
}
代理类:
package com.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import com.mysql.fabric.RangeShardMapping;
public class CalCulatorLoggingProxy {
//要代理的对象
private CalCulator target;
public CalCulatorLoggingProxy(CalCulator target) {
this.target = target;
}
public CalCulator getLoggingProxy() {
CalCulator proxy=null;
//代理对象由哪一个类加载器负责加载
ClassLoader loader=target.getClass().getClassLoader();
//代理对象的类型,即其中有哪些方法
Class[] interfaces=new Class[] {CalCulator.class};
//当调用代理对象其中的方法时,该执行的代码
InvocationHandler h=new InvocationHandler() {
/*
* proxy:正在返回的那个代理对象,一般情况下,在invoke方法中都不使用该对象。
* method:正在被调用的方法
* args:调用方法时,传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
String methodName =method.getName();
//日志
System.out.println("The method "+methodName+" begins with"+Arrays.asList(args));
//执行方法
Object result=method.invoke(target, args);
//日志
System.out.println("The method "+methodName+" end with "+result);
return result;
}
};
proxy=(CalCulator)Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
}
这样就把日志写到代理类就可以了。