1.接口
package com.derby.aop;
public interface ArithmeticCalculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
2.被代理的对象
package com.derby.aop;
import org.springframework.stereotype.Component;
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
@Override
public int add(int i, int j) {
int result = i + j;
System.out.println("我才是被代理的啊!!!");
return result;
}
@Override
public int sub(int i, int j) {
int result = i - j;
return result;
}
@Override
public int mul(int i, int j) {
int result = i * j;
return result;
}
@Override
public int div(int i, int j) {
int result = i / j;
return result;
}
}
3.代理对象
package com.derby.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class ArithmeticCalculatorLoggingProxy {
// 要代理的对象
private ArithmeticCalculator target;
public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target) {
super();
this.target = target;
}
public ArithmeticCalculator getLoggingProxy(){
ArithmeticCalculator proxy = null;
//代理对象由哪一个类加载器加载
ClassLoader loader = target.getClass().getClassLoader();
//代理对象的类型,即其中有哪些方法
Class [] interfaces = new Class[]{ArithmeticCalculator.class};
InvocationHandler h = new InvocationHandler(){
/*
* proxy:代理对象,一般不使用该对象
* method:正在被调用的方法
* 调用方法传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String methodNme = method.getName();
//打印日志
System.out.println("前置通知:methodName==="+method+"------args==="+Arrays.asList(args));
//调用目标方法.
Object result = null;
try {
//前置通知
result = method.invoke(target, args);
//返回通知,可以访问到方法的返回值
} catch (Exception e) {
e.printStackTrace();//
}
//后置通知,因为方法可以会抛出异常,所以访问不到方法的返回值
//打印日志
System.out.println("后置通知result--->"+result);
return result;
}
};
proxy = (ArithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
}
4.测试方法
package com.derby.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculatorImpl();
arithmeticCalculator = new ArithmeticCalculatorLoggingProxy(arithmeticCalculator).getLoggingProxy();
int result = arithmeticCalculator.add(11, 12);
}
}
5.
结果:
前置通知:methodName===public abstract int com.derby.aop.ArithmeticCalculator.add(int,int)------args===[11, 12]
我才是被代理的啊!!!
后置通知result--->23