1. 程式人生 > 其它 >JavaSE-24.2.5【反射案例-越過泛型檢查、執行配置檔案中指定類的指定方法】

JavaSE-24.2.5【反射案例-越過泛型檢查、執行配置檔案中指定類的指定方法】

 1 package day15.lesson2.p;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.lang.reflect.Method;
 5 import java.util.ArrayList;
 6 
 7 /*
 8 2.10 反射練習
 9 
10 2.10.1 案例-越過泛型檢查
11     通過反射技術,向一個泛型為Integer的ArrayList集合中新增一些字串String資料
12  */
13 public class Test1Reflect {
14     public
static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 15 ArrayList<Integer> arrayList = new ArrayList<>(); 16 17 arrayList.add(10); 18 arrayList.add(20); 19 // arrayList.add("hello"); //報錯,編譯異常 --> 即正常情況下無法在ArrayList<Integer>中新增String資料
20 21 //通過反射可以實現該功能 22 Class<? extends ArrayList> c = arrayList.getClass(); 23 Method add = c.getMethod("add", Object.class); //型別為Object-->那麼通過反射在arrayList新增啥型別資料都行了QAQ 24 //反射可以越過泛型檢查,獲取到原始方法所需的引數型別 25 add.invoke(arrayList, "hello"); 26 add.invoke(arrayList, "world");
27 add.invoke(arrayList, "java"); 28 29 System.out.println(arrayList); //[10, 20, hello, world, java] 30 } 31 }
1 package day15.lesson2.p;
2 
3 public class Student {
4     public void study(){
5         System.out.println("好好學習天天向上");
6     }
7 }
1 package day15.lesson2.p;
2 
3 public class Teacher {
4     public void teach(){
5         System.out.println("好好教書");
6     }
7 }
 1 package day15.lesson2.p;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 import java.lang.reflect.Constructor;
 7 import java.lang.reflect.InvocationTargetException;
 8 import java.lang.reflect.Method;
 9 import java.util.Properties;
10 
11 /*
12 2.10.2 案例-執行配置檔案中指定類的指定方法
13  */
14 public class Test2Reflect {
15     public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
16         /*Student student = new Student();
17         student.study(); //好好學習天天向上
18         Teacher teacher = new Teacher();
19         teacher.teach(); //好好教書*/
20 
21         /*
22         自定義配置檔案
23         class.txt
24             className=xxx  (注意此處類名應為帶包全路徑)
25             methodName=xxx
26          */
27         Properties properties = new Properties();
28         FileReader fr = new FileReader("stage2\\src\\day15\\lesson2\\p\\class.txt");
29         properties.load(fr);
30         fr.close();
31         System.out.println(properties); //{methodName=study, className=day15.lesson2.p.Student}
32 
33         String className = properties.getProperty("className");
34         String methodName = properties.getProperty("methodName");
35         System.out.println(className + "," + methodName); //day15.lesson2.p.Student,study
36 
37         //通過反射使用 從配置檔案中獲取的配置資訊
38         Class<?> c = Class.forName(className);
39         Constructor<?> con = c.getConstructor();
40         Object obj = c.newInstance();
41         Method method = c.getMethod(methodName);
42         method.invoke(obj);
43         /*
44         className=day15.lesson2.p.Student
45         methodName=study
46         --> 好好學習天天向上
47 
48         className=day15.lesson2.p.Teacher
49         methodName=teach
50         --> 好好教書
51          */
52     }
53 }
className=day15.lesson2.p.Teacher
methodName=teach