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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金龙 中级黑马   /  2012-7-30 17:07  /  1851 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /**
  2.          * 练习使用代理,添加功能
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 HashSet has =(HashSet)Proxy.newProxyInstance(
  8.                                 //这一步是告诉proxy用哪个类加载器加载这个类
  9.                                 HashSet.class.getClassLoader(),
  10.                                 //这一步是为了告诉动态生成类的proxy,要生成什么样的类
  11.                                 new Class[]{HashSet.class},
  12.                                 //这个参数是代理的关键参数,这个参数的作用是对要代理的方法进行操作
  13.                                 new InvocationHandler() {
  14.                                         HashSet set = new HashSet();
  15.                                         @Override
  16.                                         public Object invoke(Object proxy, Method method, Object[] args)
  17.                                                         throws Throwable {
  18.                                                 // TODO Auto-generated method stub
  19.                                         Object retVal = method.invoke(set, args);
  20.                                                 return retVal;
  21.                                         }
  22.                                 }
  23.                                 );
  24.                 //has.hashCode();
  25.                 has.add("hllo");
  26.                
  27.         }
复制代码

2 个回复

倒序浏览
陈红建 来自手机 中级黑马 2012-7-30 18:04:09
沙发
因为 Proxy 的newInstance 的一个参数就是指定一个接口。是handelr那个参数。必须是一个接口。因为是代理嘛。。你不能做厂家的事情。你要能做厂家的事情,就不用做代理了。
回复 使用道具 举报
代理嘛!简单的说就是,叫个别人去帮你做事!
那么肯定就要去实现相同的接口。不然他怎么知道帮做什么事情呢!
那么实现相同的接口。就是说,代理类和被代理类就是兄弟的关系。
既然是兄弟关系,那肯定就是不能互转换的。
但是根据多态的思想,子类是可以赋值给父类或者父接口的。
附上一张张老师讲的图!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马