2011-01-04 2 views
2

Предположим, у меня есть экземпляр java.lang.Class, c во время выполнения.Получить все классы, на которые ссылается класс

Во время выполнения, все равно, чтобы узнать, какие классы используются c? например если c.foo создает экземпляр B, B используется. если c.foo вызывает статический метод G.bar(), используется G.

Примечание: Только попытка получить, какие классы могут быть известны статически, - я очень не хватает, загруженных отражением.

В Python, эквивалентные функциональные возможности можно найти в modulefinder: http://docs.python.org/library/modulefinder.html

+1

некоторый класс может быть загружен динамически, используйте [ 'getLoadedClasses()'] (http://download.oracle.com/javase/6/ docs/api/java/lang/instrument/Instrumentation.html # getAllLoadedClasses% 28% 29) –

ответ

2

Все, что происходит за пределами метода органов, конструкторов и статических initilizers может быть запрошена с отражением. Вы можете посмотреть сигнатуры полей и методов и отобразить поля для получения фактических классов значений полей.

Классы Внутренние методы - довольно сложная задача. You может использовать BCEL или аналогичный инструмент для анализа файла класса и извлечения всех классов, которые являются hardcoded в файле класса. Но это не получится, как только вы программируете против интерфейсов:

public List someMethod() { 
    return SomeClass.getList(); 
} 

тип класса, возвращенного someMethod не известно файл класса. И нет таблицы поиска или центрального реестра. JVM будет знать тип, посмотрите, уже ли класс уже загружен и - если нет - попробуйте загрузить его. Он не должен заботиться о , который класс попросил для этого другого класса, и он не будет записывать эту информацию. Просто потому, что он не нужен для вытеснения и не нужен для сбора мусора.

2

ИМХО, это невозможно, так как другие ссылочные классы могут быть созданы с помощью отражения. Или они могут быть введены с использованием механизма впрыска зависимостей.

+0

Хорошая точка. Повторяется как игнорирование классов, на которые ссылается через отражение. – UsAaR33

1

некоторый класс может быть загружен динамически, используйте getLoadedClasses()

+0

Полезно, но это можно сделать только в ограниченных условиях. т. е. в моей main(), я создаю c и ничего больше не существует. – UsAaR33

+0

Хм, в любом случае, чтобы сделать это, не требуя -agent в командной строке? – UsAaR33

0

Возможно, вы захотите взглянуть на Heap functions available in the JVM Tool Interface, которые позволяют выполнять итерацию через кучу и рекурсивно следовать за ссылками на объекты. Это потребует много работы, чтобы использовать это, хотя.

1

Вы можете попробовать это Java Dependency Resolver project Который найдет не только ссылочные классы и банки, но и для определенного класса в Проекте.