1、什么是配置文件?
配置文件有很多种,最常用的是XML文件,Java中配置文件后缀名为.properties,内容为“键--值”形式,文件中键是固定的、值是可以修改的,用“#”来标明语句注释。编程中用 Properties 类来读取配置文件信息,Properties类主要方法如下:
(1)getProperty ( String key):通过参数 key ,获取 key 所对应的 value(通过键获取值)。
(2)load ( InputStream inStream):从输入流中读取属性列表(键和元素对)。即从IO流中获取到流中文件内的所有键值对保存起来,让 getProperty ( String key ) 方法进行检索。
(3) setProperty ( String key, String value) :通过调用父类 hashtable 的 put 方法来设置键值对。
(4)store ( OutputStream out, String comments):将键值对写入到指定的文件中去。
(5) clear ():清除所有装载的键值对。
2、为什么要用配置文件?
首先来看一个小例子,我这里有三个类,分别是:猫、狗、小鸟。
<span style="font-size:14px;">public class Cat{
public void eat(){
System.out.println("猫喜欢吃鱼");
}
}
public class Dog{
public void eat(){
System.out.println("狗喜欢啃骨头");
}
}
public class Bird{
public void eat(){
System.out.println("小鸟喜欢吃虫子");
}
}</span>
在测试类中调用猫的 eat 方法:
<span style="font-size:14px;">public class Test {
public static void main(String[] args) throws Exception {
// 获得指定对象的指定方法
Cat c = new Cat();
c.eat();
}
}</span>
如果需求变动了,需要调用狗的 eat 方法,怎么办呢?直接在主类中修改成 Dog d = new Dog();,这样是可以的,但是却违背了开发中的“开闭原则(对修改关闭,对扩展开放)”,不符合开发理念。
这时候就要用到配置文件了,配置文件就是来解决这类问题的。
3、反射+配置文件重写上面例子
猫、狗、小鸟还是用上面的类就可以,只重写测试类。
需求:我要调用猫的方法。
创建一个配置文件,在文件中定义className 和 methodName 键,分别将值设置为bao1.Cat 和 eat:
重写测试类:
<span style="font-size:14px;">public class Test {
public static void main(String[] args) throws Exception {
//创建Properties类对象以获取配置文件中内容
Properties prop = new Properties();
FileReader fr = new FileReader("test.properties"); //做出指定文件对象
prop.load(fr); //加载文件内容
fr.close();
//通过className键来获取类
String className = prop.getProperty("className");
//获取方法名
String methodName = prop.getProperty("methodName");
//获取字节码文件对象
Class c = Class.forName(className);
Constructor con = c.getConstructor(); //获取构造器对象
Object obj = con.newInstance();//创建对象
Method m = c.getMethod(methodName, null); //获取无参数方法对象
m.invoke(obj, null); // 调用方法
}
}
</span>
如果这时候需求变了,需要调用Dog的方法,直接将配置文件改为:
<span style="font-size:14px;">className = bao1.Dog #这里写类在项目路径下的全路径名
methodName = eat #需要调用的方法名
</span>
同理,调用小鸟的方法,就改为:
<span style="font-size:14px;">className = bao1.Bird #这里写类在项目路径下的全路径名
methodName = eat #需要调用的方法名
</span>
这样只修改配置文件,而不用去修改类中的代码,符合了开闭原则。
小结:文件驱动的程序是现在的主流,这种解耦和,使程序变得易维护易扩展的设计思想是非常我们值得学习的。