本帖最后由 杨兴庭 于 2013-7-22 21:25 编辑
- public static Object getProxyInstance(final Object target,final Advice adv) //这里目标类的对象被提升至Object
- {
- Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces()
- ,new InvocationHandler() //匿名内部类
- {
- @Override
- public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
- {
- adv.beforeMethod(method);
- Object retVal = method.invoke(target,args);
- /* 这里目标类的对象要调用目标类中的方法,比如目标类是ArrayList,这里ArrayList的对象list调用add方法,但是list在传进来的时候已经被提升至Object,
- 而add方法又不是Object类中的方法,也就是说父类的引用调用了子类中特有的方法,这样不会出错么?*/
- adv.afterMethod(method);
- return retVal;
- }
- });
- }
复制代码 无意间想到了一个问题,比较纠结:我们在定义一个方法getProxyInstance(Object target, Advice adv),用于获取任意一个目标类的代理类时,要给此方法传递两个参数,
其一是目标类对象,其二是扩展类代码的对象,这里扩展类代码的类型是Advice,是因为此方法内部会用到Advice中特有的两个方法beforeMethod和afterMethod,但是目
标类对象(ArrayList list)在传给此方法的第一个参数时,已经被提升至Object类型,那么 method.invoke( target,args) 这里的method是add方法时,即add.invoke(target,args) ,
这个时候父类的引用调用了子类list中特有的方法add,难道不会出错么?代码如上。
|