package Day01_Demo.Test03;/*
@create 2020--12--21--10:31
*/
import org.junit.Test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
/**
* 利用properties实现不修改源码的基础上处理数据
* <p>
* 举例:
* 单机游戏中可以修改参数 -->下载修改器,输入修改的参数就可以 --> 直接去修改的是配置文件
* 当前这个properties也是用的这个原理进行实现
* <p>
* 在实际开发中,源码是不会给甲方的,如果甲方需要修改配置,就可以直接去修改配置文件 - 操作是乙方项目实施工程师给甲方培训的。
*/
public class ConfigTest {
// @Test
public void test1() {
//测试学生和老师的对象
Student s1 = new Student(20, "Tom");
System.out.println(s1);
Teacher t = new Teacher(20, "Tom");
System.out.println(t);
}
/**
* 从配置文件ClassName中读取应该要创建的哪一个类
* 好处,想要获取老师或者是学生去修改配置文件即可,不需要修改源代码
*/
// @Test
public void test2() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//从className中读取类名
Properties prop = new Properties();
//加载配置文件并且读取
prop.load(new FileReader("className.properties"));
//根据key获取value
String className = prop.getProperty("className");
System.out.println(className);
//创建类的实例
Class clazz = Class.forName(className);
//找到该类的构造器 - 有参
Constructor constructor = clazz.getConstructor(int.class, String.class);
//利用构造函数处理
Object obj = constructor.newInstance(20, "Tom");
System.out.println(obj);
}
/**
* 从配置文件data中读取数据并且填入实例
*/
@Test
public void test3() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Properties prop = new Properties();
prop.load(new FileReader("d:"+ File.separator+"a\\className.properties"));
String className = prop.getProperty("className");
//创建实例
Class clazz = Class.forName(className);
//构造函数中进行处理
//1.从配置文件当中获取数据
Properties prop_data = new Properties();
prop_data.load(new FileReader("d:"+ File.separator+"a\\data.properties"));
String id = prop_data.getProperty("id");
String name = prop_data.getProperty("name");
System.out.println(id+" "+ name);
//2.将数据写入对象 - 构造函数写入
Constructor constructor = clazz.getConstructor(int.class, String.class);
//从properties中获取的都是字符串类型,所以要将id转化为int类型
Object obj = constructor.newInstance(Integer.parseInt(id),name);
System.out.println(obj);
}
}