一、什麼是反射?
Java執行個體運作中擷取自身的Class資訊,操作一個類的任意field和method(甚至private修飾的)。
二、如何擷取Class對象
方式 作用 應用場景 Class.forName("全限定名") 通過指定的字元串路徑 多用于配置檔案,将類名定義在配置檔案中 類名.class 通過類名的屬性class 多用于參數的傳遞 對象.getClass() 通過對象的getClass() 對象擷取位元組碼
三、基本使用
3.1建立對象
// 無參構造函數
public class GetClassConstructorDemo1 {
public static void main(String[] args) throws Exception {
//擷取類的構造方法對象,并通過運作構造方法擷取對象
Class<?> c1 = Class.forName("com.abc.clazz.Student");
//擷取無參數構造
Constructor<?> constructor = c1.getConstructor();
//運作構造方法,建立對象
Object obj = constructor.newInstance();
Student s = (Student) obj;
System.out.println("s = " + s);//Student{name='null', age=0}
}
}
// 有參構造函數
public class GetClassConstructorDemo2 {
public static void main(String[] args) throws Exception {
//擷取類的構造方法對象,并通過運作構造方法擷取對象
Class<?> c1 = Class.forName("com.abc.clazz.Student");
//擷取有參數構造方法
Constructor<?> c2 = c1.getConstructor(String.class, int.class);
Object o2 = c2.newInstance("Mark", 12);
Student s2 = (Student) o2;
System.out.println("s2 = " + s2);//Student{name='Mark', age=12}
}
}
// 最簡單的方式
public class GetClassConstructorDemo3 {
public static void main(String[] args) throws Exception {
//擷取類的構造方法對象,并通過運作構造方法擷取對象
Class<?> c1 = Class.forName("com.abc.clazz.Student");
Object o3 = c1.newInstance();
Student s3 = (Student) o3;
System.out.println("s3 = " + s3);//Student{name='null', age=0}
}
}
3.2執行成員方法
Class類中與Method相關方法
1. Method[] getMethods()
擷取所有的public修飾的成員方法,包括父類中。
2. Method getMethod("方法名", 方法的參數類型... 類型)
根據方法名和參數類型獲得一個方法對象,隻能是擷取public修飾的
Method類中關鍵方法
Object invoke(Object obj, Object... args)
傳回值Object,表示調用方法後,該方法的傳回值
根據參數args調用對象obj的該成員方法
如果obj=null,則表示該方法是靜态方法
// 反射擷取無參方法,并執行
public class GetClassMethodDemo1 {
public static void main(String[] args) throws Exception {
//反射擷取目标類的位元組碼對象,并執行其成員方法
Class<?> c1 = Class.forName("com.abc.clazz.Student");
Object obj = c1.newInstance();
//反射擷取無參數方法:Student的study方法
Method studyMethod = c1.getMethod("study");
//執行study方法
studyMethod.invoke(obj);
}
}
// 反射擷取有參方法,并執行
public class GetClassMethodDemo2 {
public static void main(String[] args) throws Exception {
//反射擷取目标類的位元組碼對象,并執行其成員方法
Class<?> c1 = Class.forName("com.abc.clazz.Student");
Object obj = c1.newInstance();
//反射擷取有參數方法:Student的eat方法
Method eatMethod = c1.getMethod("eat", String.class, double.class);
//調用eat方法,傳遞實際參數
eatMethod.invoke(obj, "蕃茄炒雞蛋", 9.9);
}
}
小結
另外,如果對并發程式設計或者面試,想要了解更多請持續關注微信公衆号:Java面試教程,關注更多有用的面試要點與技巧。
了解更多Java相關資料,請關注微信公衆号:Java面試教程
回複: bbb20,擷取更多Java資料與面試手冊
回複: bbb19,擷取Intellij idea最新版激活教程
讓我們一起,玩轉Java面試
Java反射功能雖小,意義重大,它是各種容器實作的核心。是以,了解架構的底層機制有助于豐富自己的程式設計思維。