1、什麼是Java反射機制?Java的反射(reflection)機制是指在程式的執行狀態中,可以構造任意一個類的物件,可以瞭解任意一個物件所屬的類,可以瞭解任意一個類的成員變數和方法,可以呼叫任意一個物件的屬性和方法。 這種動態獲取程式資訊以及動態呼叫物件的功能稱為Java語言的反射機制。
2、
3、獲取Class物件,有4種方法
//
package com.test.reflection;
public class Student {
private String studentName;
public int studentAge;
public Student() {
}
private Student(String studentName) {
this.studentName = studentName;
}
}
//
// 1.透過字串獲取Class物件,這個字串必須帶上完整路徑名
Class studentClass = Class.forName("com.test.reflection.Student");
// 2.透過類的class屬性
Class studentClass2 = Student.class;
// 3.透過物件的getClass()函式
Student studentObject = new Student();
Class studentClass3 = studentObject.getClass();
//4.對於基本資料型別(如 int、double 等),可以透過包裝類的 TYPE 欄位來獲取對應的 Class 物件。
Class<?> intClass = Integer.TYPE;
Class<?> doubleClass = Double.TYPE;
4、獲取這個類的成員變數
getDeclaredFields用於獲取所有宣告的欄位,包括公有欄位和私有欄位,getFields僅用來獲取公有欄位:
// 1.獲取所有宣告的欄位
Field[] declaredFieldList = studentClass.getDeclaredFields();
for (Field declaredField : declaredFieldList) {
System.out.println("declared Field: " + declaredField);
}
// 2.獲取所有公有的欄位
Field[] fieldList = studentClass.getFields();
for (Field field : fieldList) {
System.out.println("field: " + field);
}
執行程式,輸出如下:
//
declared Field: private java.lang.String com.test.reflection.Student.studentName
declared Field: public int com.test.reflection.Student.studentAge
field: public int com.test.reflection.Student.studentAge
5、獲取構造方法
// 獲取所有宣告的構造方法
Constructor[] declaredConstructorList = studentClass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructorList) {
System.out.println("declared Constructor: " + declaredConstructor);
}
```plaintext
執行程式,輸出如下:
declared Constructor: public com.test.reflection.Student()
declared Constructor: private com.test.reflection.Student(java.lang.String)
6、反射可以透過Class類動態建立類的例項。使用5中的構造方法建立物件
通常有兩種方式:
1使用無參建構函式建立例項。
2使用帶參建構函式建立例項。
如果類有一個無參建構函式,可以直接使用newInstance()方法建立物件
// 使用無參建構函式建立例項
Class studentClass = Class.forName("com.test.reflection.Student");
Constructor c1 = studentClass.getDeclaredConstructor()
Object s1 = c.newInstance();
// 使用含參建構函式建立例項
根據5中輸出的資訊可知Student類的含參構造方法的引數是String型別
Constructor c2 = studentClass.getDeclaredConstructor(String.class)
Object s2 = c2.newInstance(“torrentgz”)
7、Java反射建立物件效率高還是透過new建立物件的效率高?
透過new建立物件的效率比較高。透過反射時,先找查詢類資源,使用類載入器建立,過程比較繁瑣,所以效率較低