[英]Get method from Class then invoke via Object
為了通過反射在對象上調用方法,我知道怎么做的唯一方法是這樣的:
Object o = ...;
Method m = o.getClass().getMethod("methodName",null);
Object x = m.invoke(o,null);
Java為什么在Object類中沒有getMethods方法? (以及getSuperClass,getFields等)。
所以我們可以做類似的事情:
Object x = o.invoke("methodName",null);
為什么不? 我認為這是出於性能原因。
(也作為附帶說明。用英語來說,“主題調用對象”更有意義,所以用編程術語來說就是對象調用方法。但是使用Java時,我們得到了“對象上方法調用”。很高興讓我感到困惑你今天。)
我認為原因是應該將java.lang.Object
用作類層次結構的根,並且其上的任何方法都應屬於該對象的實例 ,而不是對象的概念。
向Object
添加反射實用程序方法會破壞這一點。 您可以選擇調用o.myMethod()
或o.invoke("myMethod", null)
,這將引入Java中不安全編譯的編程風格,因為沒有編譯時保證后者中存在“ myMethod”。 這將使開發人員很容易放棄類型安全性,而.invoke
使用.invoke
而不用考慮適當的面向對象設計。
通過強迫開發人員明確要求Class
的實例,我們在反射API和“具體” Java之間保持了這種分離。 因此,盡管有時可能會很痛苦,但最好鼓勵開發人員正確編寫代碼。 同樣,這意味着對象的OOP概念由java.lang.Object
表示,而類的概念由java.lang.Class
表示,這是對職責的一種很好的清晰區分。
類Object
是類層次結構的根。
它描述了每個類將需要的行為。
子類描述了任何其他行為,但是子類不一定必須具有行為。 您可以聲明一類常量,一個enum
甚至一個數組。 然后,在這些對象上具有invoke
方法是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.