问题
我想给某个类中的每个方法执行前后添加一些逻辑,注意是每个方法,所以一个一个加就不太适合
比如:在下面类的每个方法执行前后打印日志。
解决办法-动态代理
1、将目标对象抽出接口,并让目标对象实现该接口
2、JDK动态代理
public class ProxyTest {
public static void main(String[] args) {
// 创建目标对象
CalculatorImpl target = new CalculatorImpl();
// 传入目标对象,得到增强对象 getLogInvocationHandler在下面定义了
InvocationHandler logInvocationHandler = getLogInvocationHandler(target);
// 传入目标对象和增强对象,得到代理对象
Calculator proxy = (Calculator)Proxy.newProxyInstance(
target.getClass().getClassLoader(), //被代理的类加载器
target.getClass().getInterfaces(), //被代理的接口
logInvocationHandler //增强对象
);
proxy.add(2,3);
proxy.subtract(10,3);
}
/**
* 日志增强代码
* @param target
* @return
*/
private static InvocationHandler getLogInvocationHandler(Object target) {
return new InvocationHandler() {
@Override
public Object invoke(Object proxy1, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "方法开始执行...");
Object result = method.invoke(target, args);
System.out.println(result);
System.out.println(method.getName() + "方法执行结束...");
return result;
}
};
}
}