Лучший выбор?Редактировать байт-код (ASM) или редактировать Java-файл перед компиляцией - PullRequest
2 голосов
/ 22 февраля 2012

Цель

  • Определение места сравнения и копирования переменных
  • Введите код рядом со строкой, где произошла операция
  • Цель кода: каждый раз, когда класс запускается, счетчик увеличивается

Общее назначение: подсчитать количество сравнений и копий, выполненных после выполнения с определенными параметрами

2 варианта

Примечание: у меня всегда есть файл .java, который начинается с

1) Редактировать Java-файл


Найти сравнения с регулярным выражением и ввести фрагменты кода рядом с линией А затем скомпилируйте класс (мое приложение использует JavaCompiler)

2) Использовать ASM Bytecode engineering


Также обнаружение, где события, которые я хочу отслеживать, и вставка фрагментов в байт-код А затем используйте (уже скомпилированный, но измененный) класс

Мой вопрос

Какой самый лучший / самый чистый способ? Есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

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

Перехват доступа к переменным, вероятно, является одним из простейших вариантов использования ASM. Вы можете найти несколько более сложных сценариев в этой статье AOSD'07 .

Вот упрощенный код для перехвата доступа к переменным:

ClassReader cr = ...;
ClassWriter cw = ...;
cr.accept(new MethodVisitor(cw) {
  public void visitVarInsn(int opcode, int var) {
    if(opcode == ALOAD) {  // loading Object var
      ... insert method call
    } 
  }
});
1 голос
/ 22 февраля 2012

Если вы идете по маршруту Java, вы не хотите использовать регулярные выражения - вам нужен настоящий анализатор Java. Так что это может повлиять на ваше решение. Имейте в виду, Oracle JVM включает один, как часть их внутренних закрытых классов, которые реализуют компилятор Java, так что вам на самом деле не нужно писать один самостоятельно, если вы этого не хотите. Но декодирование Oracle AST также не является 5-минутной задачей. И, конечно, использование этого не переносимо, если это важно.

Если вы пойдете по маршруту ASM, байт-код будет легче анализировать, так как семантика намного проще. Перевесит ли простота анализа незнакомость с точки зрения чистого времени для вашего решения. В конце концов, с точки зрения сгенерированного кода, ни один не «лучше».

Существует очевидная простота просто взглянуть на сгенерированный исходный код Java и «знать», что вы видите то, что вы получаете против выполнения примитивных дампов файлов классов для отладки и т. Д., Но вся эта очевидная простота есть из-за Ваша уже существующая комфортность с языком Java. Как только вы потратите некоторое время на прохождение байт-кода, это тоже станет удобным. Просто вопрос, стоит ли вам времени, чтобы добраться туда в первую очередь.

0 голосов
/ 22 февраля 2012

Если бы это был я, я бы, вероятно, использовал опцию ASM.

Если вам нужен учебник по ASM, я наткнулся на этот учебник, написанный пользователем нажмите здесь

...