2011-10-30 114 views
1

我在想如何對繼承類進行反射?看來這些方法在我的超類構造函數中不具備反射性。反射,繼承和java

如果我有「動物」的子類「馬」,當我在「動物」superclasse的構造函數中時是否可以使用反射來訪問「馬」的方法?它似乎沒有。

+1

當然可以。是什麼讓你說 - 「看起來不是」?只需使用Reflection API來加載'Horse'類,創建一個新實例並調用它的方法。但是你能告訴我們更多爲什麼你需要這種方法嗎? – Bhaskar

+0

你可能想指定「不調用'setAccessible'。並不是說在沒有'setAccessible'的情況下在字段和非公共方法上使用反射有太多的意義 –

回答

6

SuperClass構造函數總是在子類之前運行。因此,兒童班的實例從未處於就緒狀態,因此無法使用。

+2

+1:好的方法可用,但實例不太可能處於可以使用這些方法的狀態 –

+1

@saury的確,與當前超類*相關聯的子類*的實例沒有處於就緒狀態以在超類ctr中被調用,但是問題詢問了調用一般來說,子類ctr,使用反射 - 這是很有可能的,對嗎? – Bhaskar

1

如果你有一個馬的實例,它並不重要,你在哪裏(包括int他動物構造函數),你可以訪問該實例的所有方法/字段。

但是,如果您處於普通動物或其他某個子類中,則無法訪問Horse的方法/字段,因爲它不是Horse。

+0

我認爲OP是要求別的東西:可以從超類ctr *使用反射*調用子類的ctr /方法嗎?我會說 - 是的爲什麼不 – Bhaskar

2

是不是可能的,因爲構造函數的主體在構造函數體的前面被調用。對象的馬'部分'尚不存在。

2

超類的ctor(或其他任何東西,實際上)不應該訪問子類特定的方法;超類不應該知道從它派生的類。

對於這個問題,超類不應該調用ctor中由子類定義的方法,因爲對象還沒有被初始化。 Here's some discussion regarding that, with examples.

1

是和否。通過反射API,如果您在構造函數中,則可以訪問子類(或任何類)的方法。就良好的做法而言,那麼沒有,因爲動物不是馬。

+0

真的......即使在不知道子類實例的超類構造函數內部嗎? – jayunit100

+0

訪問anoth方法呃類獨立於現有的實例。您可以通過Class.getMethod或Class.getMethods方法檢索類的方法。一旦你找到了方法,你可以通過Method.invoke方法使用這個引用的構造函數作爲obj參數來調用它。這幾乎肯定是錯誤的,但可行,可能導致拋出一些異常。 –

1

要實現的重要事情是java加載類的方式:首先加載超類,然後加載子類。

如果您需要訪問特定於子類的方法,則必須找到其他方法。

一種策略,例如,將嵌入其中一些子類中使用接口或繼承父履行合同的....