Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список загруженных в память классов 
:(
    Опции темы
LSD
Дата 6.4.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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); Вот как я его реализовал

Код

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 и получим то, что так хотели.


--------------------
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.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.