黑马程序员技术交流社区

标题: 利用java反射机制运行加载配置文件,有错误求帮解决 [打印本页]

作者: 谢永烽    时间: 2015-5-22 15:58
标题: 利用java反射机制运行加载配置文件,有错误求帮解决
开始运行还有用,一会就不行,帮我看下 这题是 模拟个电脑,定义好抽象USB接口,后期出现鼠标键盘的类 使用java反射机制关联并获取到 后期出现的类 通过在电脑端定义好的使用USB接口方法,实现运行后期出现的鼠标键盘等接口

522.png (140.14 KB, 下载次数: 14)

522.png

作者: 谢永烽    时间: 2015-5-22 15:59
package cn.itcast.day1;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;



public class ReflectTest {


        public static void main(String[] args)throws Exception {
                 
                //笔记本电脑使用usb设备
               
                NoteBook computer = new NoteBook();
                computer.run();
               
                //关联配置文件
                /*File  file = new File("usb.properties");
                FileInputStream fis = new FileInputStream(file);*/
                InputStream ips = ReflectTest.class.getResourceAsStream("usb.properties");
                //将配置文件信息缓存到集合中,记住配置文件中新添加的类名需要加上具体的包名路径
                Properties ps = new Properties();
                ps.load(ips);
                System.out.println(ps.size());
                for(int x=1;x<=ps.size();x++){
                        String className = ps.getProperty("usb"+x);//获取配置文件中类名
                        Class clazz=Class.forName(className);//获取类的Class对象
                        USB usb = (USB)clazz.newInstance();//得到类实例
                        computer.useUSB(usb);//开始使用
                }
                ips.close();//关流

        }

}
        //usb接口
  interface USB{
                void open();
                void close();
        }
//笔记本电脑
  class NoteBook{
                public void run(){
                        System.out.println("NoteBook is run!");
                }
               
                public void useUSB(USB usb){
                        if(usb!=null){
                                usb.open();
                                usb.close();
                        }
                }               
}

//鼠标
class MouseUSB implements USB{
       
                public void open(){
                        System.out.println("Mouse is use");
                }
                public void close(){
                        System.out.println("Mouse is close");
                }
}

//键盘
class KeyUSB implements USB{
                public void open(){
                        System.out.println("Key is use");
                }
                public void close(){
                        System.out.println("Key is close");
                }
}
作者: 探索者    时间: 2015-5-22 16:21
表示还没到那个程度,继续学习
作者: lanbo    时间: 2015-5-22 17:47
前来学习
作者: ZSMAN    时间: 2015-5-22 20:46
className要带上包名吧~
作者: 谢永烽    时间: 2015-5-26 15:02
ZSMAN 发表于 2015-5-22 20:46
className要带上包名吧~

我试过了关联文件的 ,有包名 usb1 = cn.itcast.day1.MouseUSB
usb2 =cn.itcast.day1.KeyUSB
作者: ZSMAN    时间: 2015-5-26 17:51
谢永烽 发表于 2015-5-26 15:02
我试过了关联文件的 ,有包名 usb1 = cn.itcast.day1.MouseUSB
usb2 =cn.itcast.day1.KeyUSB ...

注意usb.properties的写法!key=value,中间和结尾不要有空格!
作者: sss18310878521    时间: 2015-5-26 19:31
我去。。。这么牛逼。。
作者: 谢永烽    时间: 2015-5-27 09:54
ZSMAN 发表于 2015-5-26 17:51
注意usb.properties的写法!key=value,中间和结尾不要有空格!

果然是这个问题!感谢,一开始我是修改了里面的的value值,我说试试看不加包名 会报什么问题,后面添加回去的时候,可能多了空格!这个问题几天才解决 真悲哀- -还是谢谢黑马的兄弟!
作者: 谢永烽    时间: 2015-5-27 10:20
ZSMAN 发表于 2015-5-26 17:51
注意usb.properties的写法!key=value,中间和结尾不要有空格!

这里我再问下小哥,//关联配置文件
                 File  file = new File("usb.properties");
                FileInputStream fis = new FileInputStream(file);     如果我是使用的文件写入流关联配置文件,为什么系统会报说找不到文件呢?绝对路径我也试过了 依旧不知道问题在哪里,
作者: ZSMAN    时间: 2015-5-28 19:30
谢永烽 发表于 2015-5-27 10:20
这里我再问下小哥,//关联配置文件
                 File  file = new File("usb.properties");
                FileInputStream fis ...

使用绝对路径没问题~你应该知道usb.properties应该放在哪里吧?在Workspaces中的bin文件夹中~注意路径的写法:\\或者/~绝对路径的写法不知道怎么弄,我现在在外面,明天回去再帮你看看~
作者: 开到荼靡    时间: 2015-5-28 19:47
谢永烽 发表于 2015-5-27 10:20
这里我再问下小哥,//关联配置文件
                 File  file = new File("usb.properties");
                FileInputStream fis ...

这个找不到文件是异常还是你什么找不到文件?
找不到文件我一开始也有过, 后来setProperty仔细检查了下
是不是名字写错了这个也会出错, 因为反射大多都是运行时异常编译并看不出来。
作者: ZSMAN    时间: 2015-5-28 20:38
谢永烽 发表于 2015-5-27 10:20
这里我再问下小哥,//关联配置文件
                 File  file = new File("usb.properties");
                FileInputStream fis ...

相对路径的写法:bin\\cn\\itcast\\day1\\usb.properties。eclipse中的根文件夹是project文件夹(workplace),相对路径从project文件夹开始写
作者: 谢永烽    时间: 2015-5-29 12:36
本帖最后由 谢永烽 于 2015-5-29 12:42 编辑
ZSMAN 发表于 2015-5-28 20:38
相对路径的写法:bin\\cn\\itcast\\day1\\usb.properties。eclipse中的根文件夹是project文件夹(workpla ...

NICE 果然如此,  这种FileInputStream文件写入流 是需要使用到完整路径,可能我之前没写对路径的原因
作者: 谢永烽    时间: 2015-5-29 12:40
开到荼靡 发表于 2015-5-28 19:47
这个找不到文件是异常还是你什么找不到文件?
找不到文件我一开始也有过, 后来setProperty仔细检查了下
...

是路径的问题,没有写完整路径,应该从工程文件夹开始写相对路径




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