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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

final ArrayList<String> target = new ArrayList<String>();
Collection<String> collection2 = (Collection<String>) getProxy(target,new MyAdvice());
  collection2.add("abc");
  collection2.add("bcd");
  collection2.add("cef");
  collection2.add("cefg");

这个代理类,调用不了collection2.get(0)方法,为什么有些方法调用不了

评分

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

查看全部评分

4 个回复

倒序浏览

使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码。
这里要理解的是,实现类和代理类都是继承了同一个接口的(必须的)
举个例子,如果你要通过一个实现类,将文本控件中输入的数字,做 加减乘除(也许还有很多运算) 法的运算,
你发现这样会有一些问题存在,字符串如果不能转换成数字,就会报错。那么,你必须在方法的开头加入
验证判断。
但是,你又发现每个方法都要写验证是很麻烦的,而且代码量也会很多。
于是你将验证抽取出来,成为一个方法。 每个运算方法都在开头调用这个验证就行了。
这样是没有问题的。
然而,如果这个实现类不是你写的,是A程序员写的,而A程序员觉得他无法知道,使用这个实现类的程序员是否希望验证这个字符串,所以,他把字符串的验证工作交给了调用的程序员。
而你在使用这个实现类的时候,你不能修改这个实现类,给他的每个方法开头加入字符串的验证。那么怎么去让这个实现类的每个运算方法都在调用前都去验证一下呢?
代理就可以动态的在每个方法前加入验证,比如add(int,int)方法,如果调用代理类的方法,代理类将先做验证,然后再去调用实现类的方法。这个是有必要的,因为代理的动态的加入验证代码,不需要每个方法钱都加入验证。
最后总结一下,代理的作用大多是实现类的实现,对于调用者特定功能来说,做的还不够,这代理,可以加入那些还不够的代码,然后再去调用实现类。

评分

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

查看全部评分

回复 使用道具 举报
代理类是实现了和被代理类相同的接口的一个类。
也就是说,被代理类里面拥有的方法仅是被代理类的接口所拥有的方法。
当调用代理类的方法的时候,代理类的内部就会去调用被代理类的这个方法。
那也就是说,被代理类里面自己扩展的方法,代理类是不能调用的。
所以你的代码中的代理类就不能调用get方法,因为get方法是List扩展的,不是Collection的。
所以说,不是随随便便一个类都能使用动态代理的。

评分

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

查看全部评分

回复 使用道具 举报
使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码。
这里要理解的是,实现类和代理类都是继承了同一个接口的(必须的)
举个例子,如果你要通过一个实现类,将文本控件中输入的数字,做 加减乘除(也许还有很多运算) 法的运算,
你发现这样会有一些问题存在,字符串如果不能转换成数字,就会报错。那么,你必须在方法的开头加入
验证判断。
但是,你又发现每个方法都要写验证是很麻烦的,而且代码量也会很多。
于是你将验证抽取出来,成为一个方法。 每个运算方法都在开头调用这个验证就行了。
这样是没有问题的。
然而,如果这个实现类不是你写的,是A程序员写的,而A程序员觉得他无法知道,使用这个实现类的程序员是否希望验证这个字符串,所以,他把字符串的验证工作交给了调用的程序员。
而你在使用这个实现类的时候,你不能修改这个实现类,给他的每个方法开头加入字符串的验证。那么怎么去让这个实现类的每个运算方法都在调用前都去验证一下呢?
代理就可以动态的在每个方法前加入验证,比如add(int,int)方法,如果调用代理类的方法,代理类将先做验证,然后再去调用实现类的方法。这个是有必要的,因为代理的动态的加入验证代码,不需要每个方法钱都加入验证。
最后总结一下,代理的作用大多是实现类的实现,对于调用者特定功能来说,做的还不够,这代理,可以加入那些还不够的代码,然后再去调用实现类。

评分

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

查看全部评分

回复 使用道具 举报
代理类与被代理类都需要实现相同的接口,也就是说代理类和被代理类同时拥有接口声明过的方法,代理类通过这些方法调用被代理类的方法。虽然可认为Collection与ArrayList实现了相同的接口,但Collection不存在get()方法,ArrayList的get()方法也不是从接口中实现的,所以这个无法代理调用。

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马