Как получить все классы, которые «участвуют» в данном объекте? - PullRequest
1 голос
/ 03 ноября 2011

У меня есть 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 ]

2 голосов
/ 03 ноября 2011

Библиотека Reflections может справиться с этим.

С точки зрения того, «что принимало участие в его создании», вам нужно извлечь это из байт-кода. Есть несколько библиотек, которые могут помочь с этим, например, ASM и BCEL. Если вам просто нужны все зависимости, DepFind может быть достаточно.

Если вам нужно ограничить себя тем, что вы сказали, «тем, что участвует в его создании», то вам нужны только классы, задействованные в ctor, и методы, которые вызывает ctor.

Однако, если класс использует какое-либо отражение, все ставки отключены - эти типы зависимостей трудно отследить, и трудно / невозможно определить, что на самом деле используется .

1 голос
/ 03 ноября 2011

Конечно, вы можете сделать это с помощью отражения.obj.getClass() возвращает ваш собственный класс, obj.getClass().getParent() возвращает его родителя.Затем вы можете вызывать getParent() в цикле, пока не достигнете Object.

То же самое с интерфейсами, полями, методами, аннотациями.Только не забывайте, что вы должны вызывать getDeclaredMethods() и getDeclaredFields(), чтобы получить все методы и поля, включая private.И вы должны позвонить setAccessible(true), чтобы иметь дело с частными лицами.

1 час работы и все готово.Идти!Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...