1public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
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());
}
/*class $Proxy4 implements UserDAO
* {
* save(User u) {
* Method m = UserDAO.getclass.getmethod //首先拿到方法自身
* li.invoke(this, m, u) //代理獲得代理自身,方法,參數,調用代理自身的invoke方法,invoke方法中首先調用要加的邏輯(本例中的beforeMethod()),然後在調用被代理對象的方法
* }
* }
*/
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;
}
}