簡體   English   中英

如何獲得“參與”給定對象的所有類?

[英]How to get all classes that “participate” in a given object?

我有一個Java對象,一個Object類的實例-這就是我所知道的全部。 現在我需要創建一個參與其創建的Class -es列表,包括它自己的類,所有父類,其屬性和方法的所有類。 例如:

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

有可能嗎?

Reflections庫可以處理相當多的內容。

就“創建過程中參與了什么”而言,您需要將其從字節碼中刪除。 有幾個庫可以幫助解決這個問題,比如ASM和BCEL。 如果只需要所有依賴項, 那么DepFind可能就足夠了。

如果您需要限制自己所說的“創建所涉及的內容”,那么您只需要ctor調用的ctor和方法中涉及的類。

但是,如果一個類使用任何反射,那么所有的投注都是關閉的 - 這些類型的依賴關系很難被追蹤,並且很難/不可能確定實際使用的什么。

當然,你可以使用反射來做到這一點。 obj.getClass()返回自己的類obj.getClass().getParent()返回其父級。 然后你可以在循環中調用getParent() ,直到你到達Object

接口,字段,方法和注釋也是如此。 只是不要忘記你應該調用getDeclaredMethods()getDeclaredFields()來獲取所有方法和字段,包括私有。 而且,您必須調用setAccessible(true)來處理私有成員。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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