Инструментировать удаленное Java-приложение с помощью javassist+javaagent+jmx

На самом деле я хочу разработать java-приложение, которое должно инструментировать другое java-приложение, ведь у меня нет его исходного кода.

Я попытался создать агент и прикрепить его к jvm.. затем я создал mbean и попытался подключиться к нему.. он работает, когда я пытаюсь инструментировать класс в своем проекте.. но я не знаю, как я мог оснастить удаленное приложение моим приложением..

вот мой код: https://github.com/ammouna8ammouna/Monitoring.git

Я действительно новичок в мире инструментов, и мне действительно нужна помощь.


person GEmyy    schedule 11.04.2016    source источник


Ответы (1)


Если вы можете получить идентификатор процесса виртуальной машины, на которую вы нацеливаетесь, вы можете подключить свой агент, используя

com.sun.tools.attach.VirtualMachine

Например, если у вас есть pid, путь к вашей цели JAR и загрузчик, который обрабатывает JAR, вы можете попробовать что-то вроде этого:

private static void attach(String pid, String jarPath,
        ClassLoader toolLoader) throws Exception {
    Class<?> attacherLib = toolLoader.loadClass("com.sun.tools.attach.VirtualMachine");
    Class<?> string = toolLoader.loadClass("java.lang.String");

    Method attach = attacherLib.getMethod("attach", string);

    Object instance = attach.invoke(null, pid);

    Method loadAgent = attacherLib.getMethod("loadAgent", string, string);
    loadAgent.invoke(instance, jarFilePath, "");

    Method detach = attacherLib.getMethod("detach");
    detach.invoke(instance);
}

Дайте мне знать, если это ясно или вам нужна другая помощь.

person rakwaht    schedule 28.04.2016