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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王玮 中级黑马   /  2012-11-26 09:36  /  1571 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王玮 于 2012-11-26 09:43 编辑
  1. 这块代码不是。。。大家看下面的这块吧。
复制代码
  1. package aopframeworktest;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. public class AopFrameWorkTest {
  5.         public static void main(String[] args) throws  Exception{        
  6.                  InputStream in = AopFrameWorkTest.class.getResourceAsStream("config.properties");
  7.              Object bean = new BeanFactory(in).getBean("XXX");
  8.         ((ArrayList)bean).clear();
  9.              System.out.println(bean);
  10.              System.out.print(bean.getClass().getName());
  11.         }
  12. }
复制代码
把((ArrayList)bean).clear;  注释掉会得到下面的运行结果:


方法开始---执行前===========================
方法开始---执行后======
toString-------running time :0
class java.util.ArrayList
$Proxy0

不注释的话,运行结果会出现类型转换异常,如下所示:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to java.util.ArrayList
        at aopframeworktest.AopFrameWorkTest.main(AopFrameWorkTest.java:8)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
config。properties 文件的内容为:

#XXX=java.util.ArrayList
XXX=aopframeworktest.ProxyBeanFactory
XXX.target=java.util.ArrayList
XXX.advice=aopframeworktest.MyAdvice


疑问:用target的类(XXX.target=java.util.ArrayList )创建了代理,为何不能转换成ArrayList 类型的。。。很是不理解啊。。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

6 个回复

倒序浏览
大家有任何想法的都可以说下啊=。= 。。。。。=
回复 使用道具 举报
e ...........
回复 使用道具 举报
比较高级的问题{:soso_e101:}
我是菜鸟学习中,只能飘过了,飘过。。。
回复 使用道具 举报
黑马-项泽宇 发表于 2012-11-26 17:11
比较高级的问题
我是菜鸟学习中,只能飘过了,飘过。。。

谢谢留言~~加油加油!!
回复 使用道具 举报
其实这个问题是要看代理的实现方式了
我们在调用代理的时候比如getProxynewInstance这个方法是传递的参数是1目标类的类加载器,2目标类的接口,3InvocationHandler的匿名子类。因为调用代理毕竟还是反射的东西!由此看来,你能反射得到的东西也就是接口中的东西了!因为你只传入了目标类的接口!代理类并不知道你的目标类是ArrayList!其实你看一下网上的一些文章,说java的代理只是接口的实现代理!
说到这儿,也就是为什么你的bean不可以强转为ArrayList了。因为强转之后,代理是得不到你的ArrayList的特有方法的还是Collection的。
这是我的个人见解,作为参考。同时也感叹一下,好多人都在云计算板块!为何我安卓版这么冷清?
回复 使用道具 举报
王阳 中级黑马 2012-11-26 21:02:49
7#
这个要从代理的概念说起来了,代理是给具有实现同一个接口的方法的实现类加的代理,那么你获得的这样代理自然也就只能调用该接口的方法,也就是这些类的公共方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马