package com.aop.proxy;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class ProxyProvider {
private MathCaculate target;
public ProxyProvider(MathCaculate target) {
super();
this.target = target;
}
public MathCaculate getProxy() {
ClassLoader loader = target.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
String methodname = method.getName();
try {
System.out.println("[日志][方法名:"+methodname+"[方法开始]参数:"+Arrays.asList(args)+"]");
result = method.invoke(target, args);
System.out.println("[日志][方法名:"+methodname+"[方法正常结束][参数:"+result+"]");
} catch (Exception e) {
e.printStackTrace();
System.out.println("[日志][方法名:"+methodname+"[方法异常][参数:"+e.getClass().getName()+"]");
}finally {
System.out.println("[日志][方法名:"+methodname+"[方法结束]");
}
return result;
}
};
MathCaculate proxy = (MathCaculate) Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
}
其他代码在上一篇
package com.aop.proxy;
public class MathCaculateTest {
public static void main(String[] args) {
MathCaculate caculator = new success();
//MathCaculate caculator = new Log();
caculator.add(5, 5);
System.out.println();
caculator.sub(5, 5);
System.out.println();
caculator.mul(5, 5);
System.out.println();
caculator.div(5, 5);
System.out.println();
ProxyProvider provider = new ProxyProvider(caculator);
caculator = provider.getProxy();
caculator.add(5, 5);
System.out.println();
caculator.sub(5, 5);
System.out.println();
caculator.mul(5, 5);
System.out.println();
caculator.div(5, 0);
System.out.println();
}
}