2010-01-31 63 views
2

我有一個類層次結構如下所示:(=>的意思是 「是的子類」)Java反射:查找一個子類的字段

anonymous instance class => abstract class => generic abstract class 

或更簡潔地:

C => B => A 

當執行,「C」稱之爲「A」的方法之一。在「A」中的該方法中,我想使用反射來查找在類「B」中定義的對象的受保護字段。 (所以這些是「C」和「B」可以看到的字段,但不是「A」。)

我該如何用Java反射來做到這一點?如果我在A & B或B & C之間添加某些東西,我該如何面向未來?

+0

只是所以我相信我明白 - 你想調用A的子類的方法,對吧?即B從A繼承,並且你希望A調用B上的方法? – aperkins 2010-01-31 15:54:02

+0

好吧,具體而言,我想動態地訪問在A中定義的方法B上定義的字段,但該類的聲明類型是C. – roufamatic 2010-01-31 16:13:10

+0

我不明白你想要面向未來,如果反射總是引用與B?類相同,B在編譯時是否已知?如果你的繼承鏈中的哪個類不是它的位置,你如何辨別它是哪個類? – josefx 2010-01-31 16:14:43

回答

12

您必須在對象類的繼承層次結構中的每個類上重複使用getDeclaredFields()(通過getSuperclass())。

但是,您的計劃聽起來像是對繼承概念的惡意違反。預防未來的最佳方式是完全避免這種事情。什麼你試圖做的,你認爲需要這樣的反射shenanigans?

+0

+1因爲您的第二段 - 我完全同意。 – aperkins 2010-01-31 16:37:23

+9

首先我很生氣。然後,我試圖解釋我的目的是什麼,但不能沒有討論整個問題。然後我生氣了。然後,當我讓兒子入睡時,我發現我的問題可以通過讓超類創建子對象並將它們存儲在本地而沒有反射而更加乾淨地解決。感謝褲子的踢。 – roufamatic 2010-02-01 04:44:32

1
Field[] fields = getClass().getSuperclass().getDeclaredFields(); 

然後重複這些字段並得到你想要的。

如果您的層次增長,您可以將上述變換爲遞歸調用getSuperclass()(同時getSuperclass() != Object.class),從而收集所有超類的所有字段。

+1

好吧,只是爲了確保我不瘋狂 - 我完全誤解了他的問題嗎?或者他實際上是在問一個父類如何在子類中找到方法?因爲如果他在父類上詢問方法時,你的方法會起作用,但我讀到他正在問相反的問題。 – aperkins 2010-01-31 16:01:11

+0

@ aperkins,這應該也適用於子類的方法,因爲getClass()將在運行時返回對象的實際類(A),然後getSuperclass()將返回類(B),但它不是面向未來。 – josefx 2010-01-31 16:07:03

+0

是的,我意識到後,我想到了。今天早上還太早,冬天的殘骸正在殺死我的大腦。至少,這是我的藉口,我堅持這一點。 :)我適當地更新了我的答案。感謝您的迴應。 – aperkins 2010-01-31 16:10:14

1

據我所知,沒有辦法在Java中反思地瞭解你的「子類」。難道一個更好的解決方案是創建一個B必須實現的抽象方法,並調用它嗎?

public class A { 
    //other stuff here 
    protected void abstract mySubMethod(); 
    //other stuff here 
} 

編輯: 如果我誤解了你的問題,你真的想知道關於父類,然後是:getDeclaredFields()是使用,如其他海報中提到的正確方法反光。

附加編輯: 我不想讓修改此答案,但... 在一般情況下,如果你試圖給訪問父類中,「正確」和「面向未來」的方式做這是爲了創建抽象方法,這些抽象方法是getter或setters(如果需要,甚至更復雜),然後讓孩子們尊重或不尊重,並在適當的時候作出迴應。

話雖這麼說,你可以做一些像其他人說:

getClass().getParentClass().getDeclaredFields() 

然而,這只是如果C總是直接從B.思考繼承工作是由它的本質來說,棘手和具體。我必須在我正在進行的一個項目上做很多工作(不要問,相信我,你不想知道),並儘可能避免它。除非A有充分理由需要受保護的字段,並且正在發現關於它們的信息,否則您可能想要使用抽象方法。我也會提出,你可以用一種抽象方法解決另一個問題,但它可能有點困難。