13-STM32+W5500+AIR202基本控制篇-實現功能3和功能5伺服器搭建-web伺服器OpenResty配置https訪問(.Windows系統)
什麼是反射機制
Java的反射(reflection)機制是指在程式的執行狀態中,可以構造任意一個類的物件,可以瞭解任意一個物件所屬的類,可以瞭解任意一個類的成員變數和方法,可以呼叫任意一個物件的屬性和方法。這種動態獲取程式資訊以及動態呼叫物件的功能稱為Java語言的反射機制。反射被視為動態語言的關鍵(在執行階段可以改變其結構)
特點:
1、極大的提高了程式的靈活性和擴充套件性,降低模組的耦合性,提高自身的適應能力
2、通過反射機制可以讓程式建立和控制任何類的物件,無需提前硬編碼目標類
3、能夠在執行時構造一個類的物件、判斷一個類所具有的成員變數和方法、呼叫一個物件的方法(包括 private
4、是構建框架技術的基礎所在,使用反射可以避免將程式碼寫死在框架中
5、包含動態型別,而 JVM 不能對動態程式碼優化,所以效率會比較低
在Java中可以通過Reflection APIs在執行時動態生成class實體,通過Constructor建立類例項、Field訪問成員屬性、Method呼叫方法
Class類
在Java中,每個 class 都有一個相應的 Class 物件。在編譯完成後,在生成的.class檔案中,會產生一個Class物件,用於表示這個類的型別資訊。
特點:
1、由系統建立Class類
2、同一個類的例項指向同一個Class物件
3、通過Class可以完整的得到一個類所有被載入的結構
4、Class類是Java反射的基礎
獲得Class類的方法:
1 public class MyReflect { 2 public static void main(String[] args) throws ClassNotFoundException { 3 Teacher t = new Teacher(); 4 // 1、通過物件獲得 5 Class c1 = t.getClass(); 6 // 2、forName + 全限定名 獲得 7 Class c2 = Class.forName("reflect.Teacher");View Code8 // 3、通過類名獲得 9 Class c3 = Teacher.class; 10 // 4、基本資料型別的Type屬性獲得 11 Class c4 = Double.TYPE; 12 // 5、通過子類的Class物件獲得 13 Class c5 = c1.getSuperclass(); 14 } 15 } 16 class Person { 17 String name; 18 public Person() { 19 } 20 } 21 class Teacher extends Person { 22 public Teacher() { 23 } 24 }
getXXX為獲取 public 構造器、屬性、方法
getDeclaredXXX 獲取任意構造器、屬性、方法(包括private)
setAccessible方法避開許可權檢測,用以訪問許可權不足的成員
以下不在贅述
準備:Person類以及Tercher子類
1 package reflect; 2 3 class Person { 4 public String name; 5 private int age; 6 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 this.name = name; 13 } 14 15 public int getAge() { 16 return age; 17 } 18 19 public void setAge(int age) { 20 this.age = age; 21 } 22 23 public Person() { 24 } 25 26 public Person(String name, int age) { 27 this.name = name; 28 this.age = age; 29 } 30 31 @Override 32 public String toString() { 33 return "Person{" + 34 "name='" + name + '\'' + 35 ", age=" + age + 36 '}'; 37 } 38 39 public String greet(String name) { 40 return "hello " + name + "."; 41 } 42 } 43 44 class Teacher extends Person { 45 46 }View Code
Constructor類
java.lang.reflect.Constructor類是java.lang.reflect.Executable類的直接子類,用於表示類的構造方法。通過Class物件的 getConstructors() 方法可以獲得當前執行時類的構造方法
1 public class MyConstructor { 2 public static void main(String[] args) throws Exception { 3 Class<Person> c = (Class<Person>) Class.forName("reflect.Person"); 4 5 // Object person2 = c.newInstance(); //@Deprecated 6 // System.out.println(person2); 7 Constructor<Person> constructor = c.getConstructor(); 8 Person person = constructor.newInstance(); 9 System.out.println(person); 10 11 // 獲取 public 有參構造方法 12 Constructor<Person> constructor1 = c.getConstructor(String.class, int.class); 13 Person person1 = constructor1.newInstance("JL", 18); 14 System.out.println(person1); 15 16 // 獲取構造方法 17 Constructor<Person> constructor2 = c.getDeclaredConstructor(String.class, int.class); 18 constructor2.setAccessible(true); 19 Person person2 = constructor1.newInstance("JL", 18); 20 System.out.println(person2.name); 21 } 22 }View Code
Field類
java.lang.reflect.Field類用於封裝成員變數資訊,呼叫Class物件的getField()或getFields()等方法可以獲得當前執行時類的成員變數
1 public class MyField { 2 public static void main(String[] args) throws Exception { 3 Class<?> c = Class.forName("reflect.Person"); 4 // 在Person類中,無參的構造方法不能省略 5 Object p = c.getConstructor().newInstance(); 6 7 // 獲取 public 成員變數 8 Field[] fields = c.getFields(); 9 // 獲取所有成員變數(包括 private) 10 Field[] allFields = c.getDeclaredFields(); 11 //獲取指定名稱public變數 12 Field f1 = c.getField("name"); 13 // 成員變數set、get 14 f1.set(p, "JL"); 15 System.out.println(f1.get(p)); 16 17 Field f2 = c.getDeclaredField("age"); // private int age 18 // 忽略許可權檢查,使得 private 成員可以被訪問 19 f2.setAccessible(true); 20 f2.set(p, 18); 21 System.out.println(f2.get(p)); 22 } 23 }View Code
Method類
1 public class MyMethod { 2 public static void main(String[] args) throws Exception { 3 Class<Person> c = (Class<Person>) Class.forName("reflect.Person"); 4 Person p = c.getConstructor().newInstance(); 5 // 獲取所有 public 方法 6 Method[] methods = c.getMethods(); 7 // 獲取 greet 方法 8 Method method1 = c.getMethod("greet", String.class); 9 //執行 greet 方法 10 System.out.println(method1.invoke(p, "JL")); 11 } 12 }View Code
getDeclaredXXX