![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Спасибо MoonCat за хорошую статью.
Действительно, в пакете java.lang.instrument есть интерфейс Instrumentation, в котором среди прочих объявлен метод Class[] getAllLoadedClasses(). Но! Его реализацию не так-то просто получить. Как я выяснил из описания, реализацию интерфейса Instrumentation, можно получить лишь одним способом - написать агента. Агент - это класс ваш реализующий метод public static void premain(String agentArgs, Instrumentation inst); Этот класс будет загружен виртуальной машиной Java в память, во время старта программы, а потом будет вызван метод premain(), в который и будет передан объект реализующий интерфейс Instrumentation. И так задача получения списка загруженных классов в память сводится к получению реализации интерфейса Instrumentation, которая в свою очередь предается только один раз и только в метод premain() агента. Для этого я предлагаю создать своего агента, и использовать его для получения ссылки на реализацию интерфейса Instrumentation. И так, по шагам 1) Создаем агента, сохраняющего в открытом статическом поле ссылку на реализацию интерфейса Instrumentation. 2) Подключаем агента к нашей программе. 3) Используем агента для для получения ссылки на реализацию интерфейса Instrumentation. Шаг 1. Чтобы создать агента нам надо написать класс реализующий метод public static void premain(String agentArgs, Instrumentation inst); Вот как я его реализовал
класс имеет поле public static Instrumentation instrumentation, которое будет служить нам "лазом" к реализации интерфейса Instrumentation. Этот класс нужно скомпилировать и содрать в jar архив, и что самое важное манифест этого архива должен содержать ключ Premain-Class: ИмяКлассаАгента. В данном случае ключ выглядит так: Premain-Class: Agent Создайте jar архив с именем Agent.jar Шаг 2. Программа которая будет использовать наш класс в качестве агента, должна быть запущена с дополнительным ключом -javaagent:ПутьиИмяКАрхиваАгента.jar, если вы собрали агента к примеру в Agent.jar, то пометстите его в classpath Вашего основного проекта запустите программу с дополнительным ключом -javaagent:Agent.jar. Если все сделано правильно, то JVM подгрузит при старте агента и вызовет его метод premain(String agentArgs, Instrumentation inst). Шаг 3 И так при хорошем стечении обстаятельств агент загружен в память и его метод premain() был успешно вызван, а это значит что поле instrumentation хранит ссылку на реализацию интерфейса Instrumentation. Получить её можно с помощью Reflection, как в следующем примере:
Здесь с помощью Reflection мы получим данные статического поля, которое как известно одно для всех классов. Приведем это значение к типу Instrumentation и получим то, что так хотели. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |