JavaSE-24.2.4【反射獲取成員方法並使用】
阿新 • • 發佈:2021-06-20
1 package day15.lesson2; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 6 7 /* 8 2.8 反射獲取成員方法並使用 9 10 Class類獲取成員方法物件的方法 11 12 Method[] getMethods() 返回所有公共成員方法物件的陣列,包括繼承的 13 返回一個包含方法物件的陣列,方法物件反映由該 Class物件表示的類或介面的所有公共方法,14 包括由類或介面宣告的物件以及從超類和超級介面繼承的類 15 16 Method[] getDeclaredMethods() 返回所有成員方法物件的陣列,不包括繼承的 17 返回一個包含方法物件的陣列,方法物件反映由Class物件表示的類或介面的所有宣告方法, 18 包括public,protected,default(package)訪問和私有方法,但不包括繼承方法 19 20 Method getMethod(String name, Class<?>... parameterTypes) 返回單個公共成員方法物件21 返回一個方法物件,該物件反映由該Class物件表示的類或介面的指定公共成員方法 22 23 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回單個成員方法物件 24 返回一個方法物件,它反映此表示的類或介面的指定宣告的方法 Class物件 25 26 Method類用於執行方法的方法 27 Object invoke(Object obj,Object... args) 呼叫obj物件的成員方法,引數是args,返回值是Object型別28 */ 29 public class Demo6Reflect { 30 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 31 Class<?> c = Class.forName("day15.lesson2.Student"); 32 33 34 Method[] methods = c.getMethods(); 35 for (Method m: methods){ 36 System.out.println(m); 37 } 38 /* 39 public java.lang.String day15.lesson2.Student.toString() 40 public void day15.lesson2.Student.method2(java.lang.String) 41 public java.lang.String day15.lesson2.Student.method3(java.lang.String,int) 42 public void day15.lesson2.Student.method1() 43 public final void java.lang.Object.wait() throws java.lang.InterruptedException 44 public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException 45 public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException 46 public boolean java.lang.Object.equals(java.lang.Object) 47 public native int java.lang.Object.hashCode() 48 public final native java.lang.Class java.lang.Object.getClass() 49 public final native void java.lang.Object.notify() 50 public final native void java.lang.Object.notifyAll() 51 */ 52 System.out.println(); 53 54 55 Method[] declaredMethods = c.getDeclaredMethods(); 56 for (Method m: declaredMethods){ 57 System.out.println(m); 58 } 59 /* 60 public java.lang.String day15.lesson2.Student.toString() 61 private void day15.lesson2.Student.function() 62 public void day15.lesson2.Student.method2(java.lang.String) 63 public java.lang.String day15.lesson2.Student.method3(java.lang.String,int) 64 public void day15.lesson2.Student.method1() 65 */ 66 System.out.println(); 67 68 69 Method method = c.getMethod("method1"); //獲取成員方法物件,傳入方法名及原方法所需引數的型別 70 71 /*Student s = new Student(); 72 s.method1();*/ 73 //通過反射實現上述 74 Constructor<?> con = c.getConstructor(); //獲取無參構造 75 Object obj = con.newInstance(); //建立物件 76 77 /* 78 Method類:在類或介面上提供有關單一方法的資訊和訪問許可權 79 Object invoke(Object obj, Object... args) 在具有指定引數的指定物件上呼叫此方法物件表示的基礎方法 80 obj:呼叫方法的物件 81 args:方法需要的引數 82 */ 83 method.invoke(obj); //method 84 } 85 }
1 class Student{ 2 //成員變數 3 private String name; //私有 4 int age; //預設 5 public String address; //公共 6 7 //構造方法 8 public Student() { //公共 9 } 10 11 public Student(String name, int age, String address) { //公共 12 this.name = name; 13 this.age = age; 14 this.address = address; 15 } 16 17 private Student(String name){ //私有 18 this.name = name; 19 } 20 21 Student(String name, int age){ //預設 22 this.name = name; 23 this.age = age; 24 } 25 26 //成員方法 27 private void function(){ //私有 28 System.out.println("function"); 29 } 30 31 public void method1(){ //公共 32 System.out.println("method"); 33 } 34 35 public void method2(String s){ //公共 36 System.out.println("method:" + s); 37 } 38 39 public String method3(String s, int i){ //公共 40 return s + "," + i; 41 } 42 43 @Override 44 public String toString() { //公共 45 return "Student{" + 46 "name='" + name + '\'' + 47 ", age=" + age + 48 ", address='" + address + '\'' + 49 '}'; 50 } 51 }
1 package day15.lesson2; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 6 7 /* 8 2.9 反射獲取成員方法並使用練習 9 10 通過反射獲取成員方法並呼叫 11 12 通過反射實現如下: 13 Student s = new Student(); 14 s.method1(); 15 s.method2("tom"); 16 String str = s.method3("tom, 23"); 17 sout(str); 18 s.function(); 19 */ 20 public class Demo7Reflect { 21 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 22 Class<?> c = Class.forName("day15.lesson2.Student"); 23 24 // Student s = new Student(); 25 Constructor<?> con = c.getConstructor(); 26 Object obj = con.newInstance(); 27 28 // s.method1(); 29 Method method1 = c.getMethod("method1"); 30 method1.invoke(obj); //method 31 32 // s.method2("tom"); 33 Method method2 = c.getMethod("method2", String.class); 34 method2.invoke(obj, "tom"); //method:tom 35 36 // String str = s.method3("tom, 23"); 37 Method method3 = c.getMethod("method3", String.class, int.class); 38 Object o = method3.invoke(obj, "tom", 23); 39 System.out.println(o); //tom,23 40 41 // s.function(); 42 Method function = c.getDeclaredMethod("function"); //私用只能使用xxxDeclaredxxx 43 function.setAccessible(true); //私有必須暴力反射,不然無法實現會報錯 44 function.invoke(obj); //function 45 } 46 }