反射运行配置文件

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>
  这样只修改配置文件,而不用去修改类中的代码,符合了开闭原则。

  小结:文件驱动的程序是现在的主流,这种解耦和,使程序变得易维护易扩展的设计思想是非常我们值得学习的。


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值