Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (20)


Список загруженных в память классов

Поиск:
Спасибо 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); Вот как я его реализовал

Код

import java.lang.instrument.Instrumentation;
public class Agent {

/** Creates a new instance of Agent */
public Agent() {
}
public static Instrumentation instrumentation = null;
public static void premain(String agentArgs, Instrumentation inst){
System.out.println("agent is loaded!!!");
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, как в следующем примере:

Код

import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field;

public class Main {

/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {

Field f = Class.forName("Agent").getField("instrumentation");
Instrumentation i = (Instrumentation) f.get(null);
Class c[] = i.getAllLoadedClasses();
System.out.println("test Ints : " + c[0].getName());

} catch (Exception ex) {
ex.printStackTrace();
}
}
}


Здесь с помощью Reflection мы получим данные статического поля, которое как известно одно для всех классов. Приведем это значение к типу Instrumentation и получим то, что так хотели.
Автор: MoonCat






Просмотров: 3007

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную