我必須實現一個邏輯,給定一個子類,我需要訪問它的父類和該父類的所有其他子類(如果有的話)。我沒有在Java Reflection中找到任何API,它允許我們訪問父類的所有子類。有什麼辦法可以做到嗎?訪問Java中每個父類的子類
例如:
class B extends class A
class C extends class A
現在用B類,我可以通過調用getSuperClass()
找到超類。但是有沒有辦法找到所有的子類,只要我有父類,即類B和類C?
我必須實現一個邏輯,給定一個子類,我需要訪問它的父類和該父類的所有其他子類(如果有的話)。我沒有在Java Reflection中找到任何API,它允許我們訪問父類的所有子類。有什麼辦法可以做到嗎?訪問Java中每個父類的子類
例如:
class B extends class A
class C extends class A
現在用B類,我可以通過調用getSuperClass()
找到超類。但是有沒有辦法找到所有的子類,只要我有父類,即類B和類C?
如果這不是作業(第三方圖書館可能不允許),我會建議Google Reflections'Reflections#getSubTypesOf()
。
Set<Class<? extends A>> subTypes = reflections.getSubTypesOf(A.class);
您可以自行掃描類路徑,與ClassLoader#getResources()
開始,其中傳遞""
姓名做更多或更少自己。
你是對的:這裏沒有直接的API。我想你可以掃描所有加載的類,看看它們是否是給定類的子類。
一個問題:你只能找到已經加載的類。這些方法都不會找到尚未加載的類。
您可以使用:
thisObj.getClass().getSuperclass()
thisObj.getClass().getInterfaces()
thisObj.getClass().getGenericInterfaces()
thisObj.getClass().getGenericSuperclass()
我最近編碼的東西掃描類的成員,如果這些是非元掃描那些爲好。但是,我沒有向上走,所以我沒有使用上述方法,但我相信他們應該做你想做的。
編輯: 我跑了以下簡單的測試:
public class CheckMe {
public CheckMe() {
}
}
public class CheckMeToo extends CheckMe {
public CheckMeToo() {
}
}
// In main
System.out.println(CheckMeToo.class.getSuperclass());
// Output
class CheckMe
,它的編碼遍歷的問題後。如果它的參數化,那麼事情可能會變得有點複雜,但仍然可行。
編輯:對不起,沒有仔細閱讀,讓我看看它進一步。
編輯:似乎沒有任何辦法可以做到這一點,而無需掃描CLASSPATH中的所有內容,並檢查以確保某個對象是某個類的實例。
您是否將此特定問題設置爲家庭作業,或者您是否設置了其他問題,並且此問題是您實施解決方案的一部分?我問,因爲另一種解決方案可能是針對您的問題採取不同的方法。 – 2010-04-23 00:15:08
@Stephen:這是家庭作業的要求之一,與任何其他要求/問題無關。 – 2010-04-23 03:45:05