JavaSE-24.2.5【反射案例-越過泛型檢查、執行配置檔案中指定類的指定方法】
阿新 • • 發佈:2021-06-20
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 publicstatic 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