Java基础之AOP原理

这篇博文如果不能在五分钟内写出来,说明没有掌握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

 

 

 

 

 

posted @ 2016-11-07 22:10  john8169  阅读(179)  评论(1编辑  收藏  举报