您的位置:首页 > 其它

反射运行配置文件

2015-11-25 08:37 337 查看
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>  这样只修改配置文件,而不用去修改类中的代码,符合了开闭原则。
  小结:文件驱动的程序是现在的主流,这种解耦和,使程序变得易维护易扩展的设计思想是非常我们值得学习的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: