这篇博文如果不能在五分钟内写出来,说明没有掌握aop的原理
终于知道为什么不能invoke方法里调用proxy.toString()方法,因为要转发
package javaplay.day3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class ProxyTest {
public static void main(String[] args) throws Exception {
final ArrayList target = new ArrayList();
// 加入系统中的功能是以一个对象的形式传递进去的,对哪个目标进行作用也是以一个对象传递进去的
// spring就是把这两个对象一配,代理就完了
// 这个就是spring aop的原理
Collection proxy3 = (Collection) getProxy(target, new MyAdvice());
proxy3.add("zxx");
proxy3.add("lhm");
proxy3.add("bxd");
System.out.println(proxy3.size());
System.out.println(proxy3.getClass().getName());
}
// 以后要生成代理就把目标和建议(有时也叫通告)给过来就行了
// 这个方法就可以固定成为黑匣子,以后玩sping只干一件事,只写MyAdvice就行了,在配置文件配置目标就行了
private static Object getProxy(final Object target, final Advice advice) {
Object proxy3 = Proxy.newProxyInstance(target.getClass().getClassLoader(),
/* new Class[] { Collection.class }, */target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
* long beginTime = System.currentTimeMillis(); Object
* retVal = method.invoke(target, args); long endTime =
* System.currentTimeMillis();
* System.out.println(method.getName() +
* " running time is " + (endTime - beginTime)); return
* retVal;
*/
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
});
return proxy3;
}
}
package javaplay.day3;
import java.lang.reflect.Method;
public interface Advice {
void beforeMethod(Method method);
void afterMethod(Method method);
}
package javaplay.day3;
import java.lang.reflect.Method;
public class MyAdvice implements Advice {
long beginTime = 0;
@Override
public void beforeMethod(Method method) {
System.out.println("到itcast来学习");
beginTime = System.currentTimeMillis();
}
@Override
public void afterMethod(Method method) {
System.out.println("从itcast毕业了");
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " running time is " + (endTime - beginTime));
}
}
输出:
到itcast来学习
从itcast毕业了
add running time is 1
到itcast来学习
从itcast毕业了
add running time is 0
到itcast来学习
从itcast毕业了
add running time is 0
到itcast来学习
从itcast毕业了
size running time is 0
3
com.sun.proxy.$Proxy0