2011-12-13 2 views
3

Я пытаюсь обвести голову вокруг этой концепции. Мои вопросы:Java-код впрыска

  1. Эта операция стоит дорого с точки зрения производительности, и если да, то почему?
  2. Если я пытаюсь перехватить некоторые параметры, передаваемые методу, введя некоторый код после вызова метода, происходит ли это инъекция один раз или происходит это каждый раз при вызове метода?
  3. Где находится этот код инъекции? В самом источнике приложения или где-то еще?

ответ

7

Вы можете получить инъекцию байт-кода с помощью Java-агентов.

java Agent - это библиотека, которая перехватывает загрузку байт-кода в загрузчике классов и улучшает ее до того, как она будет загружена в JVM. Конечно, такая библиотека обычно полагается на librairies манипуляции байт-кода, такие как Javassist, ASM или CGLib. Итак, манипуляция байткодом выполняется только один раз, когда класс загружен.

Смотрите официальный Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

В данной статье описывается, как сделать довольно много, что вы хотите: http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html

Кроме того, если вы действительно заинтересованы в байткоде основе, эта статья от одного разработчиков JRebel вам должно понравиться: http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html

Наконец, вы можете взглянуть на Серена, личность, которую я только начал писать. Это агент Java, который расширяет сериализуемые классы. Это только начало, но оно работает. https://github.com/oliviercroisier/seren

+0

Спасибо за ответ, но вы по-прежнему не дали ответа на три вопроса. –

+3

Извините, вот еще несколько объяснений. 1: отсутствие штрафа за производительность, это чистый байт-код (без прокси). 2: Это происходит только один раз, при загрузке класса, см. Выше. 3: Код агента находится в банке, которую вы должны указать в командной строке (-javaagent vm parameter); сгенерированный код живет с остальной частью «нормального» кода, в пространстве PermGen в куче. –

Смежные вопросы