14.5 Explain what object reflection is in Java and why it is useful.
Java中的物件反射機制可以獲得Java類和物件的反射資訊,並可採取如下操作:
1. 在執行階段獲得類內部的方法和欄位資訊
2. 新建類的例項
3.通過獲取欄位引用來獲得和捨棄物件欄位,無論該欄位是私有還是公有的。
下列程式碼是物件反射的一個例子:
// Parameters Object[] doubleArgs = new Object[] {4.2, 3.9}; // Get class Class rectangleDefinition = Class.forNmae("MyProj.Rectangle"); // Equivalent: Rectange = new Rectangle(4.2, 3.9); Class[] doubleArgsClass = new Class[] {double.class, double.class}; Constructor doubleArgsConstructor = rectangleDefinition.getConstructor(doubleArgsClass); Rectangle rectangle = (Rectangle) doubleArgsConstructor.newInstance(doubleArgs); // Equivalent: Double area = rectangle.area(); Method m = rectangleDefinition.getDeclaredMethod("area"); Double area = (Double) m.invoke(rectangle); // This code does the equivalent of Rectangle rectangle = new Rectange(4.2, 3.9); Double area = rectangle.area();
物件反射為什麼有用?
1. 觀測和操控應用執行時的行為
2. 幫助除錯和測試程式,通過直接接觸到方法,建構函式和欄位
3. 我們可以呼叫方法即便我們事先不知道該方法。比如,我們可以讓使用者傳入類名稱,構建函式的引數,和方法名稱。我們利用這些資訊區建立一個物件並呼叫一個方法。
想了解更多關於Java反射機制的內容,可以參見Java 反射機制學習資料。