黑马程序员技术交流社区

标题: 关于Aop代理的一个不解 [打印本页]

作者: 王玮    时间: 2012-11-26 09:36
标题: 关于Aop代理的一个不解
本帖最后由 王玮 于 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 类型的。。。很是不理解啊。。


作者: 王玮    时间: 2012-11-26 13:02
大家有任何想法的都可以说下啊=。= 。。。。。=
作者: 王玮    时间: 2012-11-26 17:05
e ...........
作者: 黑马-项泽宇    时间: 2012-11-26 17:11
比较高级的问题{:soso_e101:}
我是菜鸟学习中,只能飘过了,飘过。。。
作者: 王玮    时间: 2012-11-26 18:14
黑马-项泽宇 发表于 2012-11-26 17:11
比较高级的问题
我是菜鸟学习中,只能飘过了,飘过。。。

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2