A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-29 11:03 编辑

我用做好的创建代理方法,想要创建一个ArrayList的代理,为什么我传进一个ArrayList对象,得到的只能是List或者Collection对象?如果强转成ArrayList会报错,这是什么原因呢?
下面是代码:
  1. package com.study.day3;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Proxy;
  7. import java.util.ArrayList;
  8. import java.util.Collection;

  9. public class TestTest {
  10.         public static void main(String[] args) throws Exception {
  11.                
  12.                 ArrayList target = new ArrayList();
  13.                 Advise advise = new MyAdvise();
  14.                 Collection proxy4 = (Collection) getProxy(target,advise);//问题在这里,只能用强转成Collection和List,不能专程ArrayList

  15.                 System.out.println(proxy4.toString());//注意:从Object继承来的方法,只有toString,hashCode,equals,
  16.                 System.out.println(proxy4.getClass());//调用时委托给InvocationHandler,其他的方法Proxy自己都有实现.

  17.         }
  18.         
  19.         private static Object getProxy(final Object target,final Advise advise) {
  20.                 Object proxy3 = Proxy.newProxyInstance(
  21.                                 target.getClass().getClassLoader(),
  22.                                 target.getClass().getInterfaces(),
  23.                                 new InvocationHandler(){
  24.                                         @Override
  25.                                         public Object invoke(Object proxy, Method method, Object[] args)
  26.                                                         throws Throwable {
  27.                                                 
  28.                                                 advise.before(method);
  29.                                                 Object reValue = method.invoke(target, args);
  30.                                                 advise.after(method);
  31.                                                 return reValue;
  32.                                         }
  33.                                 }
  34.                                 );
  35.                 return proxy3;
  36.         }
  37. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
万琪 + 1

查看全部评分

2 个回复

倒序浏览
,,自然是这样的,,,你没看代理是面向接口的吗
回复 使用道具 举报
万琪 发表于 2013-7-26 19:25
,,自然是这样的,,,你没看代理是面向接口的吗

就是说我创建一个类的代理,这个代理不能实现这个类的全部功能,只能实现这个类的接口的全部功能的意思吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马