Итак, я создаю приложение-профилировщик. Он имеет GUI-класс, который используется для управления профилировщиком. Он состоит из 2-х частей во время выполнения: 1) Применение (GUI) для управления 2) агент, чтобы быть загружены в целевое приложениеСсылка на ClassLoaders в другой VM
Это перечисляет PIDs, а затем вызывает loadAgent() на ВМ. Поэтому я хочу, чтобы вся логика выполнялась в основном приложении. Идея, которую я имел, заключалась в том, чтобы получить экземпляр класса Instrumentation от моего агента, а затем вызвать метод обратного вызова посредством отражения. Это установило бы статическое поле в основном приложении экземпляру Instrumentation и сообщило первичному приложению, что агент успешно загружен.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу захватить класс первичного приложения, который содержит поле Instrumentation. Класс.forName (String) неявно выглядит в ClassLoader для этого приложения. Другой метод может искать классы в другом ClassLoader ... к сожалению, я полностью не смог получить ClassLoader для агента/целевого приложения из основного приложения, чтобы перейти в него!
Я не вижу методов в инструментах или классах VirtualMachine, которые позволяют мне это делать. Я не нашел таких вопросов в Интернете, которые отвечают удовлетворительным образом.
У меня были некоторые идеи ... A) Если есть какой-то эквивалент класса Class.forName для ClassLoaders, возможно, я мог бы сериализовать ClassLoader и отправить сериализованную строку по сокету, а затем захватить ее таким образом. До сих пор я не нашел ничего подобного. B) Перейдите через ClassLoaders в агенте (есть метод ClassLoader.getParent(), но это единственный способ навигации, который я вижу), и найдите подходящий ClassLoader с глубоким сравнением. Я даже не знаю, с чего начать. Я надеялся, что смогу перебирать VirtualMachines.list(), и я бы мог позвонить. Нет. C) Загрузите агент в основное приложение и каким-то образом передайте этот конкретный экземпляр агента целевому приложению. Поскольку они разные ClassLoaders, я могу только предположить, что это не работает. Насколько я знаю, может быть способ сделать это, хотя? D) Создайте собственный ClassLoader в основном приложении и загрузите целевое приложение, используя это. Проблема здесь в том, что я хочу полностью «прикрепить» функциональность, которая это предотвращает.
Я действительно не хочу ставить всю логику в агенте, поэтому я думал, что попрошу вас, ребята, до этого маршрута. Гуглинг это было менее плодотворным. Заранее спасибо!