JavaWeb-1.2.3【基础加强:案例(反射+配置文件)】

 1 package com.yubaby.reflect;
 2 
 3 import com.yubaby.domain.Person;
 4 
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.lang.reflect.InvocationTargetException;
 8 import java.lang.reflect.Method;
 9 import java.util.Properties;
10 
11 /*
12 * 案例:
13     * 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
14         * 实现:
15             1. 配置文件
16             2. 反射
17         * 步骤:
18             1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
19             2. 在程序中加载读取配置文件
20             3. 使用反射技术来加载类文件进内存
21             4. 创建对象
22             5. 执行方法
23  */
24 
25 /**
26  * 框架类
27  * 需求:可以创建任意类的对象,可以执行任意方法
28  * 前提/要求:不能改变该类的任何代码
29  *            比如下方:person和student需要手动创建/更改对象
30  *            即搞一个针对不同类不同对象万能的,不用手动更改的
31  * 通过配置文件操作的优点:使程序扩展能力更强
32  */
33 public class ReflectTest {
34     public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
35         /*Person person = new Person();
36         person.eat();
37         Student student = new Student();
38         student.sleep();*/
39 
40         //1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
41         //自定义配置文件pro.properties(名称、后缀随便,无硬性要求;创建在src下)
42 
43         //2 在程序中加载读取配置文件
44         //2.1 创建Properties类对象properties
45         Properties properties = new Properties();
46         //2.2 获取本类所需的配置文件
47         ClassLoader classLoader = ReflectTest.class.getClassLoader();
48         InputStream is = classLoader.getResourceAsStream("pro.properties");
49         //2.3 加载配置文件
50         properties.load(is);
51 
52         //3 使用反射技术来加载类文件进内存
53         //3.1 获取配置文件中事先定义的数据
54         String className = properties.getProperty("className");
55         String methodName = properties.getProperty("methodName");
56         //3.2 加载该类进内存
57         Class<?> cls = Class.forName(className);
58 
59         //4. 创建对象
60         //4.1 类对象
61         /*Object obj = cls.newInstance();
62         //https://blog.csdn.net/qq_44312950/article/details/108782753
63         //java1.9版本后class.newInstance()方法被弃用*/
64         Object obj = cls.getDeclaredConstructor().newInstance();
65         //4.2 方法对象
66         Method declaredMethod = cls.getDeclaredMethod(methodName);
67 
68         //5. 执行方法
69         declaredMethod.invoke(obj);
70 
71         /*
72         className=com.yubaby.domain.Person
73         methodName=eat
74 
75         eat...
76          */
77 
78         /*
79         className=com.yubaby.reflect.Student
80         methodName=sleep
81 
82         sleep...
83          */
84     }
85 }
 1 package com.yubaby.domain;
 2 
 3 public class Person {
 4     private String name;
 5     private int age;
 6 
 7     public int a;
 8     protected int b;
 9     int c;
10     private int d;
11 
12     public Person() {
13     }
14 
15     public Person(String name, int age) {
16         this.name = name;
17         this.age = age;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public void setAge(int age) {
25         this.age = age;
26     }
27 
28     public String getName() {
29         return name;
30     }
31 
32     public int getAge() {
33         return age;
34     }
35 
36     @Override
37     public String toString() {
38         return "Person{" +
39                 "name='" + name + '\'' +
40                 ", age=" + age +
41                 ", a=" + a +
42                 ", b=" + b +
43                 ", c=" + c +
44                 ", d=" + d +
45                 '}';
46     }
47 
48     public void eat(){
49         System.out.println("eat...");
50     }
51 
52     public void eat(String food){ //函数重载
53         System.out.println("eat:" + food);
54     }
55 }

 

posted @ 2021-06-22 19:48  yub4by  阅读(52)  评论(0编辑  收藏  举报