Java программные способы получения двоичных данных, связанных с классом

Каковы некоторые способы получить двоичные данные, связанные со ВСЕМИ классами во время выполнения, байт-код Java (я хочу записать данные на диск).

И я не хочу использовать JMX.

По сути, я пытаюсь обнаружить проблему с классом и хочу поместить класс на диск из запущенного байт-кода.

  1. Есть ли список ВСЕХ классов, которые запускаются из загрузчика классов?

  2. Как мне получить этот список?

  3. Какой код можно использовать для извлечения данных байт-кода, как только я получу список классов?

2 ответа

Решение

Точно так же, как сказал Стивен С., опция -verbose может сделать список отслеживания загруженных классов. Если вы хотите извлечь файлы классов, возможно, вы можете использовать java.lang.instrument, чтобы получить файлы классов. Это просто для инструментария Java-байт-кода.

Основной способ заключается в следующем:

Измерительные приборы наибольшую роль, это определение динамических изменений и эксплуатации. Разработчики могут обычные Java-программы (с основной функцией Java), выполняющие параметры via-javaagent, указывать конкретные файлы jar (включая Instrumentation Agents) для запуска агента Instrumentation . Резюме говорит о следующих шагах:

  • Подготовленная предварительная функция

    Подготовка Java-класса, который содержит следующие два метода любого общего Public static void premain (String agentArgs, Instrumentation inst), [1] public static void premain (String agentArgs), [2]

    пакет sample.verboseclass;

public class Main {public static void premain (Строковые аргументы, Instrumentation inst) { ... } }

Среди них приоритет [1] [2] уровня, чем высокий приоритет будет реализация ([1] и [2] В то же время, суд пренебрег [2]). В этой основной функции разработчик может выполнять тип операции. AgentArgs является основной функцией параметров процесса, сопровождающих "-javaagent". И основная функция отличается, этот параметр представляет собой строку, а не строковый массив, если параметры ряда процедур, процедур, которые будут строкой самоанализа. Inst - это примеры java.lang.instrument.Instrumentation из JVM, импортируемые автоматически. Инструментальный пакет Java.lang.instrument.Instrumentation является определением интерфейса, является основной частью этого пакета, в котором сосредоточены практически все функции, например, определение преобразования типа и операции и так далее. Вы должны также реализовать этот интерфейс

пакет sample.verboseclass;

публичный класс Main {

public static void premain(String args, Instrumentation inst) {
    inst.addTransformer(new Transformer());
}

}

Класс Transformer реализует ClassFileTransformer {

public byte[] transform(ClassLoader l, String className, Class<?> c,
        ProtectionDomain pd, byte[] b) throws IllegalClassFormatException {
    System.out.print("Loading class: ");
    System.out.println(className);
    return b;
}

}

  • Упаковка банок

    Этот класс Java будет упакован в файл jar, в котором свойства проявляются путем добавления "Premain-Class" к указанным шагам, подготовленным с использованием premain класса Java. (Может также потребоваться указать другие свойства, чтобы открыть больше функций)

    Manifest-Version: 1.0 Premain-Class: sample.verboseclass.Main

  • операция

    Запуск с помощью следующих инструментов с Java-программами: Java-javaagent: позиция документа jar [= импортированные предварительные параметры]

Как и в вашем проекте, вы можете написать коды для извлечения байтового кода в методе ClassFileTransformer, который передаст загрузчик byecode в него.

У меня есть ощущение, что вы должны быть в состоянии сделать это, внедрив собственный загрузчик классов, который записывает загруженные классы и записывает их файлы байт-кода по мере их загрузки. Но делать это после факта было бы намного сложнее.

Если вы не пытаетесь взломать / взломать зашифрованное приложение (tsk, tsk), возможно, существует лучший способ "обнаружить проблему". Почему бы вам не рассказать нам, что вы действительно пытаетесь сделать?


Если вы просто хотите получить список загруженных классов, запустите JVM с -verbose:class опция установлена.

Другие вопросы по тегам