簡體   English   中英

從類獲取方法,然后通過對象調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM