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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 创造命运 中级黑马   /  2014-4-25 22:09  /  1128 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看完最后一节,总算学完了张老师的高新技术。
在最后一节里,我虽然可以凭着看完后的记忆跟感觉,将代码一点点写出来,并且能够看懂代码之间的关系,至于为什么要如此那般的做,说实话还不是很明白。尽管如此,在运行程序的时候,我还是发现了一点问题。我截了几张图,如下:
图一、配置文件的内容

图二、测试程序代码

图三、这里定义了一个Properties属性类,通过它获取配置文件中的内容

图四、修改后的配置文件

图五、再次修改后的配置文件


下面复制一段代码,功能是通过配置文件中的名字获取对象
        public Object getBean(String name)  //创建getBean方法,通过配置文件中的名字获取bean对象
        {
                Object bean = null;
                String className = properties.getProperty(name);  //从配置文件中读取类名,通过键获取值
                try {
                        Class clazz = Class.forName(className);
                        bean = clazz.newInstance();  //由类的字节码获取对象
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                if (bean instanceof ProxyFactoryBean)  //判断bean是特殊的bean即ProxyFactoryBean还是普通的bean
                {
                        Object proxy = null;
                        //是ProxyFactoryBean的话,强转,并获取目标和通告
                        ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;  
                        try {
                                //获取advice和target
                                Advice advice = (Advice)Class.forName(properties.getProperty(name + ".advice")).newInstance();
                                Object target = Class.forName(properties.getProperty(name + ".target")).newInstance();
                                //设置目标和通告
                                proxyFactoryBean.setAdvice(advice);
                                proxyFactoryBean.setTarget(target);
                                //通过类ProxyFactoryBean(开发中是作为接口存在)中获得proxy对象
                                proxy = proxyFactoryBean.getProxy();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        return proxy;  //是ProxyFactoryBean的话,返回proxy对象
                }
                return bean;
        }
在附件里有源代码。


现象:
如果按照图一的配置文件运行程序,输出结果: $Proxy0
如果按照图四的配置文件运行程序,输出结果: java.util.ArrayList
如果按照图五的配置文件运行程序,输出结果: $Proxy0


问题:
1、为什么按照图五的配置文件执行的结果是$Proxy0,而不是java.util.ArrayList呢?照理说通过配置文件的第一行就已经可以获取到bean对象了啊。这里的结果是$Proxy0,说明程序读完了配置文件中的所有内容,并将内容加载进了Properties集合,而刚好通过ProxyFactoryBean也可以获取到一个bean对象,就这样获得了一个代理类的对象。我想知道为什么会这样?
2、程序将配置文件中的内容加载到了Properties集合中,那么在Properties集合中就会存在有如下键值对:
            xxx=java.util.ArrayList
            xxx=cn.itcast.day3.aopframework.ProxyFactoryBean
这里就有个一个问题,Properties集合是属于Map集合,而在Map集合中,键的值是不能重复的。为什么在这里可以呢?还没有出错。

cn.rar

4.48 KB, 下载次数: 71

评分

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

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马