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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张承富 中级黑马   /  2013-6-22 13:32  /  1368 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 2013-6-27 07:00 编辑

跟视频一样啊,没看到哪里不一样
  1. import java.util.*;
  2. import java.io.*;
  3. public class ReflectDemo_2 {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) throws Exception{//测试用,开发要try
  8.                 //getRealPath
  9.                 //一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的
  10.                 InputStream ips = new FileInputStream("config.properties");
  11.                
  12.                 //.class 类加载器,在classpath目录下逐一查找指定的文件
  13.                 //ReflectDemo_2.class.getClassLoader().getResourceAsStream("config.properties");
  14.                 Properties props = new Properties();
  15.                 props.load(ips);
  16.                 ips.close();//是把调用的系统资源关掉
  17.                 String className = props.getProperty("className");
  18.                 //////////////////////////////////报错了!!!!!!!!!!!
  19.                 Collection collections = (Collection)Class.forName(className).newInstance();
  20.                
  21.                 //Collection collections = new ArrayList();// size为4,有序集合,重复一样放
  22.                 //Collection collections = new HashSet();    //size为3  无序集合,重复的元素不放
  23.                 ReflectPoint pt1 = new ReflectPoint(3,3);
  24.                 ReflectPoint pt2 = new ReflectPoint(5,5);
  25.                 ReflectPoint pt3 = new ReflectPoint(3,3);
  26.                
  27.                 collections.add(pt1);
  28.                 collections.add(pt2);
  29.                 collections.add(pt3);
  30.                 collections.add(pt1);
  31.                
  32.                 /*
  33.                  * 框架与框架要解决的核心问题
  34.                  *         我做房子卖给用户住,由用户自己安装门窗和空调,我做房子就是框架,用户需要使用我的框架,
  35.                  *         把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类
  36.                  *
  37.                  *         我在写框架(房子)时,你这个用户还不会写程序,我写的框架程序怎么样能调用你以后写的类(门窗)呢?
  38.                  *         因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要用反射来做
  39.                  *
  40.                  *
  41.                  * */
  42.                
  43.                 pt1.y = 7;
  44.                 collections.remove(pt1);//如果上面没改,size变1,该了size为2
  45.                                                                 //内存泄露,因为改了哈希值,所以找不到了对象
  46.                                                                 //对象一直没用,还一直存在,所以内存泄露
  47.                
  48.                 //hashCode()的作用
  49.                 /*
  50.                  * hash表结构合可以把hash集合分为若干的区域,然后按照生成的hashcode值放在那个区域
  51.                  * 如果两个对象equals相等,那么hashcode也必须相等,但是equals不等的对象可能hashcode值相同
  52.                  * 当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算的哈希值的字段了
  53.                  */
  54.                 System.out.println(collections.size());//重写为2,不重写为3
  55.                 System.out.println(pt1.equals(pt3));//重写equals方法后为true,不重写false
  56.                
  57.         }

  58. }
复制代码
Exception in thread "main" java.lang.ClassNotFoundException: "java.util.Collection"
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at cn.itheima.day1.ReflectDemo_2.main(ReflectDemo_2.java:20)


评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

3 个回复

倒序浏览
无法定位到那个类 Collection collections = (Collection)Class.forName(className).newInstance();一句话中 Class.forName(className)那就是获取className的时候出错了。再检查一下
回复 使用道具 举报
oxf974025918 发表于 2013-6-22 14:16
无法定位到那个类 Collection collections = (Collection)Class.forName(className).newInstance();一句话 ...

可能是config.properties里面没有设置键值对吧key=className,value=包名.类名

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
className=java.util.ArrayList
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马