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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭彦君 中级黑马   /  2013-4-8 15:09  /  1163 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭彦君 于 2013-4-8 23:16 编辑

用反射获取配置文件的类名,然后进行操作。代码如下
  1. class ReflectionClass{
  2.         public static void main(String [] args) throws Exception{
  3.                 //创建一个读取流,关联配置文件.注意:在实际开发中一般不会用相对路径来获取配置文件。
  4.                 InputStream is = new FileInputStream("config.properties");

  5.                 //为了验证是否关联成功,将数据读到缓冲区,并打印。
  6.                 byte [] buf = new byte[1024];
  7.                 int len = is.read(buf);
  8.                 for (int i=0; i<len; i++) {
  9.     System.out.print(buf[i]);                        
  10.                 }
  11.                 //创建properties对象
  12.                 Properties p = new Properties();
  13.                 //加载文件中的内容
  14.                 p.load(is);
  15.                 is.close();
  16.                 //获取配置信息中键值对的值,得到类名
  17.                 String className = p.getProperty("className");
  18.                 //创建该类的对象
  19.                 Collection collections = (Collection) Class.forName("className").newInstance();
  20.                 collections.add("abc");
  21.                 collections.add("bbc");
  22.                 collections.add("abc");
  23.                 System.out.println(collections.size());
  24.         }
  25. }
复制代码
发现两个问题
1、我将配置文件放到和这个类相同的目录下,用相对路径就会出现无法找到文件异常,只能用绝对路径,为什么视频中就可以用相对路径
     配置文件内容:className=java.util.ArrayList
     异常信息:Exception in thread "main" java.io.FileNotFoundException: config.properties (系统找不到指定的文件。)                     at java.io.FileInputStream.open(Native Method)
                     at java.io.FileInputStream.<init>(Unknown Source)
                     at java.io.FileInputStream.<init>(Unknown Source)
                     at lann.Day2.ReflectionClass.main(ReflectionClass.java:246)//行号不一样,因为我文件中的还有其他代码,复制的不全。
2、如果我改成绝对路径后,配置信息可以读取到,但是又出现下面的异常
       Exception in thread "main" java.lang.ClassNotFoundException: className
       这又是为什么?
搞的头都大了,大神们帮忙看看,谢了

6 个回复

倒序浏览
1.视频中使用相对路径是因为使用的是ClassLoader类的对象的getResourceAsStream方法,通过io流来操作文件应该根据classpath来指定对应的路径
默认的classpath应该是工程的根目录。
2.流资源应该在获取到className后才可以关闭吧
回复 使用道具 举报
黑马李超 发表于 2013-4-8 15:18
1.视频中使用相对路径是因为使用的是ClassLoader类的对象的getResourceAsStream方法,通过io流来操作文件应 ...

用另一种也试过
InputStream is = ReflectionClass.class.getClassLoader().getResourceAsStream("config.properties");
但是又出现异常了
Exception in thread "main" java.lang.NullPointerException
用这个方法连配置信息都读不出来了。

还有关闭流资源可以加载完就关了,因为已经加载到内存了
回复 使用道具 举报
Collection collections = (Collection) Class.forName("className").newInstance();//这个className是String类 不需要加引号吧
回复 使用道具 举报
如果该程序是放在以java.开头的包内,请更换包名...
回复 使用道具 举报
黑马李超 发表于 2013-4-8 15:34
Collection collections = (Collection) Class.forName("className").newInstance();//这个className是Str ...

哦哦,晕了,确实这里错了:L
这个把className的异常解决了。谢谢大神
但是第一个问题没解决掉,还是不能用相对路径,不知道怎么回事
回复 使用道具 举报
谭辉 发表于 2013-4-8 15:45
如果该程序是放在以java.开头的包内,请更换包名...

没有,是放到自己命名的包里
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马