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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NNERO 中级黑马   /  2014-4-16 17:30  /  1041 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NNERO 于 2014-4-16 19:22 编辑
  1.         //InputStream ips = new FileInputStream("config.properties");//父类创建子类对象
  2.                
  3.                 InputStream ips = ReflectDemo2.class.getResourceAsStream("reflectpratice/config.proerties");
  4.                 Properties props = new Properties();//使用properties提取键值对
  5.                
  6.                 props.load(ips);
  7.                 ips.close();
  8.                 String className = props.getProperty("className");
  9.                
  10.                 Collection collections = (Collection)Class.forName(className).newInstance();//使用反射创建对象
  11.                
  12.                 ReflectPoint r1 = new ReflectPoint(5,5);//创建对象
  13.                 ReflectPoint r2 = new ReflectPoint(6,4);
  14.                 ReflectPoint r3 = new ReflectPoint(5,5);
  15.                
  16.                 collections.add(r1);//添加对象到集合中
  17.                 collections.add(r2);
  18.                 collections.add(r3);
  19.                
  20.                 System.out.println(collections.size());//打印集合中对象的数量
复制代码
2个问题:
第一个问题://InputStream ips = new FileInputStream("config.properties");//父类创建子类对象 这里为何要用父类创建子类,有什么好处?
第二个问题:这个程序运行出错:
Exception in thread "main" java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Properties.java:434)
        at java.util.Properties.load0(Properties.java:353)
        at java.util.Properties.load(Properties.java:341)
        at reflectpractice.ReflectDemo2.main(ReflectDemo2.java:15)
不知道 怎么的。可能是路径问题,但是我解决不了。Eclipse的classpath路径是在哪儿。。?

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
1.体现了java中的多态,就像你做的这道题
   Collection collections = (Collection)Class.forName(className).newInstance();//使用反射创建对象
  这句代码是将properties文件中的字符串反射成子类 假如你properties文件中写的是className=java.util.ArrayList
   则相当于    Collection collection=new  ArrayList();  //当然可以
   如果你写的是  ArrayList  collections=(ArrayList)Class.forName(className).newInstance();//也可以
   但是如果你以后  配置文件里要改成 className=java.util.LinkedList
    那   ArrayList collections=(ArrayList)Class.forName(className).newInstance();//就无法通过了
  意思就是说:用多态的方式可以增强程序的扩展 性能,你以后就不用改代码了
2.路径问题的话
     如果你写的是相对路径,默认应该是从src下找,如果文件是在src写那你应该写的是
       InputStream ips = ReflectDemo2.class.getResourceAsStream("config.proerties");
    如果你写的是
      InputStream ips = ReflectDemo2.class.getResourceAsStream("reflectpratice/config.proerties");
      那src写应该有一个名字叫reflectpratice的包,properties文件应该是放在这个包中
   如果reflectpratice 是工程的名字的话
      那properties文件就应该在 放在src下

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
原来如此,多态体现拓展性,   而classpath是在src下。了解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马