- /**
- *在方法getProxy当中,通过newProxyInstance()方法可以创建一个代理类的实例对象,
- *在该方法内部通过其三个参数在底层创建一个代理类对象(Object)proxy:
- *1、Class<?> clazzs =
- * getProxyClass(target.getClass().getClassLoader(),target.getClass().getInterfaces());
- *2、final Constructor<?> cons = clazzs.getConstructor(constructorParams);
- *3、Object proxy = cons.newInstance(new InvocationHandler());
- *
- *问题:
- *如proxy.add("flx");实例方法调用过程中产生的三个参数:(Collection)proxy,(Method)add,(Parameter)"flx";
- *对于第3步,InvocationHandler接口中的方法invoke,接收的三个参数分别与上面三个参数相对应,但是invoke是一个
- *抽象方法,在程序中是根本看不到一点联系关系的,在JAVA中他们是怎么做到相对应的?又是怎么调用这三个参数的?
- *
- */
- package cn.itcast.day3;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.ArrayList;
- import java.util.Collection;
- import cn.itcast.day3.aopframework.Advice;
- import cn.itcast.day3.aopframework.MyAdvice;
- public class ProxyQuestion {
- public static void main(String[] args) throws Exception {
- final ArrayList<Object> target = new ArrayList<Object>();
- @SuppressWarnings("unchecked")
- Collection<Object> proxy = (Collection<Object>) getProxy(target, new MyAdvice());
- proxy.add("flx");
- proxy.add("bxd");
- System.out.println(proxy.size());
- System.out.println(proxy.toString());
- System.out.println(proxy.getClass().getName());
- }
-
- private static Object getProxy(final Object target, final Advice advice)throws Exception{
-
- Object retProxy = Proxy.newProxyInstance(
- target.getClass().getClassLoader(),
- target.getClass().getInterfaces(),
- new InvocationHandler() {
- // invoke中的参数proxy代理类是通过target的类加载器、其继承接口以及调用处理程序获得的。
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- advice.beforeTime();
- Object retVal = method.invoke(target, args);
- advice.afterTime(method);
- return retVal;
- }
- });
- return retProxy;
- }
- }
复制代码 |