1. package Day01_Demo.Test03;/*
    2. @create 2020--12--21--10:31
    3. */
    4. import org.junit.Test;
    5. import java.io.File;
    6. import java.io.FileReader;
    7. import java.io.IOException;
    8. import java.lang.reflect.Constructor;
    9. import java.lang.reflect.InvocationTargetException;
    10. import java.util.Properties;
    11. /**
    12. * 利用properties实现不修改源码的基础上处理数据
    13. * <p>
    14. * 举例:
    15. * 单机游戏中可以修改参数 -->下载修改器,输入修改的参数就可以 --> 直接去修改的是配置文件
    16. * 当前这个properties也是用的这个原理进行实现
    17. * <p>
    18. * 在实际开发中,源码是不会给甲方的,如果甲方需要修改配置,就可以直接去修改配置文件 - 操作是乙方项目实施工程师给甲方培训的。
    19. */
    20. public class ConfigTest {
    21. // @Test
    22. public void test1() {
    23. //测试学生和老师的对象
    24. Student s1 = new Student(20, "Tom");
    25. System.out.println(s1);
    26. Teacher t = new Teacher(20, "Tom");
    27. System.out.println(t);
    28. }
    29. /**
    30. * 从配置文件ClassName中读取应该要创建的哪一个类
    31. * 好处,想要获取老师或者是学生去修改配置文件即可,不需要修改源代码
    32. */
    33. // @Test
    34. public void test2() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    35. //从className中读取类名
    36. Properties prop = new Properties();
    37. //加载配置文件并且读取
    38. prop.load(new FileReader("className.properties"));
    39. //根据key获取value
    40. String className = prop.getProperty("className");
    41. System.out.println(className);
    42. //创建类的实例
    43. Class clazz = Class.forName(className);
    44. //找到该类的构造器 - 有参
    45. Constructor constructor = clazz.getConstructor(int.class, String.class);
    46. //利用构造函数处理
    47. Object obj = constructor.newInstance(20, "Tom");
    48. System.out.println(obj);
    49. }
    50. /**
    51. * 从配置文件data中读取数据并且填入实例
    52. */
    53. @Test
    54. public void test3() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    55. Properties prop = new Properties();
    56. prop.load(new FileReader("d:"+ File.separator+"a\\className.properties"));
    57. String className = prop.getProperty("className");
    58. //创建实例
    59. Class clazz = Class.forName(className);
    60. //构造函数中进行处理
    61. //1.从配置文件当中获取数据
    62. Properties prop_data = new Properties();
    63. prop_data.load(new FileReader("d:"+ File.separator+"a\\data.properties"));
    64. String id = prop_data.getProperty("id");
    65. String name = prop_data.getProperty("name");
    66. System.out.println(id+" "+ name);
    67. //2.将数据写入对象 - 构造函数写入
    68. Constructor constructor = clazz.getConstructor(int.class, String.class);
    69. //从properties中获取的都是字符串类型,所以要将id转化为int类型
    70. Object obj = constructor.newInstance(Integer.parseInt(id),name);
    71. System.out.println(obj);
    72. }
    73. }