应用环境:
将新的业务逻辑单独出来,下面是一个例子:
首先将LogInterceptor独立出来:
package com.bjsxt.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogInterceptor implements InvocationHandler {
private Object target; //要代理的目标
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) { //被代理方法的名字
System.out.println(m.getName() + " start");
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m); //在执行方法之前,先执行代理中的方法
m.invoke(target, args); //然后在执行要执行的方法
return null;
}
}
测试类:
@Test
public void testProxy() {
UserDAO userDAO = new UserDAOImpl(); //被代理对象
LogInterceptor li = new LogInterceptor(); //要加入的Handler,即代理
li.setTarget(userDAO); //需要代理的目标
UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(
userDAO.getClass().getClassLoader(),userDAO.getClass().getInterfaces(), li);
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());
}
Proxy.newProxyInstance(arg0, arg1, arg2)
第一个参数:用哪个ClassLoader来产生代理对象,要和被代理对象用同一个ClassLoader,产生的代理对象中实际上包含了一个被代理对象;
第二个参数:被代理的对象实现了哪些个接口;userDAO.getClass().getInterfaces()==new Class[]{UserDAO.class};
第三个参数:当我产生了这个代理之后,要用哪一个Handler进行处理。
注意:userDAOProxy.getClass()打印出来的是class $Proxy4
注意:代理是根据userDAO.getClass().getInterfaces()被代理接口产生的,也就是说,被代理类的接口中有哪些方法,那么代理出来的类中就有哪些方法。
那么代理中的方法是怎么是怎么实现的呢?
代理中的每个方法在实现的时候都会把它自身传给InvocationHandler。