黑马程序员技术交流社区

标题: 利用反射加载一个配置文件,报错,找了半宿了。救命 [打印本页]

作者: 孙浩迪    时间: 2012-6-28 19:29
标题: 利用反射加载一个配置文件,报错,找了半宿了。救命
本帖最后由 sunhaodi 于 2012-6-29 16:45 编辑

class Test{
    public void run(){
     
     System.out.println("welcome to heima!");
     
    }
}
public class PropertiesDemo {

   
   public static void main(String[] args) throws Exception{
   
     
      
     InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("prop.properties");
     
     
      Properties pro =  new  Properties();
      
      
      pro.load(in);
      in.close();
      String className = pro.getProperty("prop");
       Class c=Class.forName(className);
       Object ob=c.newInstance();
       Method m=c.getMethod("run");
      
       m.invoke(ob,args);
}

}
我的配置文件在src目录下prop.properties ,   配置文件件里面是prop=Test通过这个配置文件用反射技术并加载上面的run 方法,打印。


配置文件:prop=Test



报的异常是:
java.lang.ClassNotFoundException: Test
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at EightDemo.PropertiesDemo.main(PropertiesDemo.java:45)

这个是不是类型转换异常?

文件的位置和配置文件里面的东西

未命名.jpg (20.69 KB, 下载次数: 47)

未命名.jpg

未命名.1jpg.jpg (1.79 KB, 下载次数: 51)

未命名.1jpg.jpg

作者: 孙浩迪    时间: 2012-6-28 19:30
报空指针异常。。。 {:soso_e154:}   不知道什么情况。。
作者: 赵倩倩    时间: 2012-6-28 19:54
你这段程序有如下几个问题,"SevenDemo/prop.properties",把前边的删掉,只留prop.properties,因为他在类路径的根目录下,所以前边是不应该有东西的。
这个时候没有取到prop

另外还有另外两个问题propertie文件中,为pro=SystemInTest,在get的时候 pro.getProperty("prop");应为 pro.getProperty("pro");写错了

改完这些就可以运行了
作者: 孙浩迪    时间: 2012-6-28 20:01
赵倩倩 发表于 2012-6-28 19:54
你这段程序有如下几个问题,"SevenDemo/prop.properties",把前边的删掉,只留prop.properties,因为他在类 ...

我贴帖子的时候 ,写错了,我程序里的都对呢。。   报这个异常

Exception in thread "main" java.lang.ClassNotFoundException: SystemInTest
        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:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at EightDemo.PropertiesDemo.main(PropertiesDemo.java:46)
作者: 赵倩倩    时间: 2012-6-28 20:06
本帖最后由 赵倩倩 于 2012-6-28 20:09 编辑

pro=SystemInTest, 前后多余的空格,都干掉

作者: 孙浩迪    时间: 2012-6-28 21:34
赵倩倩 发表于 2012-6-28 20:06
pro=SystemInTest, 前后多余的空格,都干掉

怎么干掉啊,好像配置文件里面没有空格啊
作者: 周朋飞    时间: 2012-6-28 21:45
大哥你既然想获得Test里面的方法 肯定是配置文件当中写的是pro=Test的全路径啊 怎么会是PropertiesDemo  改过来就OK了

作者: 孙浩迪    时间: 2012-6-28 21:54
周朋飞 发表于 2012-6-28 21:45
大哥你既然想获得Test里面的方法 肯定是配置文件当中写的是pro=Test的全路径啊 怎么会是PropertiesDemo  改 ...

java.lang.ClassNotFoundException: Test
        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:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at EightDemo.PropertiesDemo.main(PropertiesDemo.java:45)

改了, 改成prop=Test了,  报的上面的异常啊
作者: 孙浩迪    时间: 2012-6-28 22:23
有木有大侠看看啊  {:soso_e154:}
作者: 周朋飞    时间: 2012-6-28 22:34
配置文件你是不是写的这种格式  config.properties    我都试出来了  可以再群上说

作者: 孙浩迪    时间: 2012-6-28 22:46
周朋飞 发表于 2012-6-28 22:34
配置文件你是不是写的这种格式  config.properties    我都试出来了  可以再群上说
...

是啊,  我写的是prop.properties
作者: 周朋飞    时间: 2012-6-29 00:23
那不应该啊 我都按照你的程序写的 结果都出来了  为什么你的不行啊 是不是路径问题啊 你把配置文件放在同一个目录下
作者: 孙浩迪    时间: 2012-6-29 13:24
周朋飞 发表于 2012-6-29 00:23
那不应该啊 我都按照你的程序写的 结果都出来了  为什么你的不行啊 是不是路径问题啊 你把配置文件放在同一 ...

放在同一个包中啊?    你看看上面的图片,我是放在那的,不知道对不?  就下面有个prop.properties文件
作者: 周朋飞    时间: 2012-6-29 15:12
放你包里面  试试 跟你那执行文件放在一个包里 你这是放在了src目录下

作者: 孙浩迪    时间: 2012-6-29 15:42
周朋飞 发表于 2012-6-29 15:12
放你包里面  试试 跟你那执行文件放在一个包里 你这是放在了src目录下

放在同一个包里就报空指针。。。Exception in thread "main" java.lang.NullPointerException
作者: 黑马罗坚    时间: 2012-6-29 17:29
pro=  后面应该是包名.leiming    class.forName  对应JAVA系统类来说可以字节写类名  如果是你自己写的类 请加包名.类名
作者: 黑马罗坚    时间: 2012-6-29 17:36
JVM抛的异常就可以看出问题来 并不是没重配置文件中读出数据  如果没读出数据是报NullpointException  而你报的是java.lang.ClassNotFoundException: Test  来加载器无法定位到该类
即找不到Test类   了解异常类的信息也助于解决问题  所以看API时 抛的异常信息也是要看的





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