Java программные способы получения двоичных данных, связанных с классом - PullRequest
1 голос
/ 18 ноября 2011

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

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

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


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

1 голос
/ 18 ноября 2011

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

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

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

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

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

    образец пакета. Verboseclass;

публичный класс Main { public static void premain (Строковые аргументы, Instrumentation inst) { ... } }

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

образец пакета. 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-версия: 1.0 Premain-Class: sample.verboseclass.Main

  • Операция

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

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

...