Java动态代理
package com.server;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//InvocationHandler是一个监听器, 当代理对象调用任何方法的时候都会经过InvocationHandler的invoke方法
public class ProxyHelper implements InvocationHandler {
private TimerService target;
public void setTarget(TimerService target) {
this.target = target;
}
@Override
// proxy 是拦截到的代理对象 args是方法参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("执行" + method.getName() + "方法前,记录日志。。。");
method.invoke(target, args);
System.out.println("执行" + method.getName() + "方法后,记录日志。。。");
return null;
}
}
写法二:
package com.server;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// InvocationHandler是一个监听器, 当代理对象调用任何方法的时候都会经过InvocationHandler的invoke方法
public class ProxyHelper implements InvocationHandler {
private Object target; // 先备份目标
public Object newProxyInstance(Object target){
this.target = target; // *****
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
// proxy.a();
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
System.out.println("代理对象调用方法了....调用的是"+arg1.getName());
System.out.println(arg1.getName()+"开始执行, 开始记录日志");
// target.a(参数);
// arg0 是拦截到的代理对象
try{
arg1.invoke(target, arg2);
}catch(Exception e){
System.out.println(arg1.getName()+"出现异常, 开始记录日志");
}
System.out.println(arg1.getName()+"执行完毕");
return null;
}
// 之前切面: 打开session 启动事务
// dao 功能执行 --------------------> 异常切面
// 之后切面: 提交事务 关闭session
}
调用:
package com.server;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
TimerService target = new TimerBean(); // 这里可以利用Spring的注入
ProxyHelper helper = new ProxyHelper();
helper.setTarget(target);
TimerService service = (TimerService)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), helper);
service.b();
}
}