2011-11-03 93 views
1

我有一個java對象,類Object的一個實例 - 這就是我所知道的。現在我需要創建一個參與其創建的Class列表,包括它自己的類,所有父類,所有類的屬性和方法。例如:如何獲得「參與」給定對象的所有類?

List obj = new ArrayList(); 
obj.add(new Integer(4)); 
obj.add(new Foo()); 
System.out.println(allRelatedClasses(obj)); 

輸出應該是這樣的:

Object, List, Collection, Iterable, Serializable, Cloneable, RandomAccess, 
ArrayList, Integer, Foo 

是否有可能呢?

回答

2

Reflections庫可以處理相當多的。

根據「參與創建的內容」,您需要將其從字節碼中提取出來。有幾個庫可以幫助解決這個問題,比如ASM和BCEL。如果你只需要全部依賴關係,DepFind可能就足夠了。

如果您需要將自己限制爲您所說的「創建過程中涉及的內容」,那麼您只需要ctor調用的類和ctor調用的方法。

如果一個類使用任何的反映,但是,所有的賭注都關閉 - 這些類型的依賴關係是很難跟蹤,這是難以/無法確定什麼是用於實際上

+0

ASM或BCEL可以幫助在上面的例子中獲得到'Integer'和'Foo'的鏈接? – yegor256

+0

@ yegor256是;你會詢問方法來提取所有使用的完全合格的類名。也就是說,我不清楚你是否需要手動執行此操作,或者是否已經使用DepFind或類似操作。 –

1

當然,你可以使用反射。 obj.getClass()返回你自己的類,obj.getClass().getParent()返回它的父類。然後您可以撥打getParent(),直到您到達Object

接口,字段,方法,註釋也是如此。請不要忘記,您應該撥打getDeclaredMethods()getDeclaredFields()以獲取包括私人在內的所有方法和字段。你必須致電setAccessible(true)與私人成員打交道。

1小時的工作,你完成了。走!祝你好運。

+0

在上面的例子中反射不會給我'整數'和'Foo',因爲它可以處理靜態字節碼結構,我還需要找到運行時對象的鏈接 – yegor256

相關問題