2013-04-01 2 views
3

Насколько я понимаю, API-интерфейс Attach, введенный в Java 6, позволяет осуществлять межпроцессное изменение классов, запущенных в целевом JVM с помощью агентов. Мои вопросы:Ограничения и область применения Java Attach API

  1. Является ли эта стратегия ограничивается только приборами классов, которые не загружены мишенью JVM? и
  2. Каковы пределы этих преобразований?. Например, можно изменить только тело существующих методов? Или все в определении класса можно изменить?

ответ

2
  1. Вы можете инструмент оба класса уже загружен или загружен, перехватывая их с ClassFileTransformer. Однако, если ретрансформированный метод имеет активные кадры стека, эти активные кадры продолжают запускать байт-коды исходного метода. Ретрансформированный метод будет использоваться для новых вызовов.
  2. Переопределение/ретрансляция может изменять тела методов, постоянный пул и атрибуты. Переопределение/ретрансляция не должна добавлять, удалять или переименовывать поля или методы, изменять подписи методов или изменять наследование. Эти ограничения могут быть отменены в будущих версиях. Байты файла класса не проверяются, не проверяются и не устанавливаются до тех пор, пока не будут применены преобразования, если результирующие байты ошибочны, этот метод выдает исключение.

Интерфейс javadoc для интерфейса Instrumentation содержит большую часть информации, о которой вы просите.

+0

Я вижу. Это бесполезно, что не позволяет добавлять новые методы. Я думал, пытаясь добавить новый интерфейс к определению класса, но если добавление методов не возможно, это не сработает :(Как вы думаете, я должен был бы сделать что-то вроде предоставления определенной реализации существующей абстрактной методы и изменение класса от абстрактного до не абстрактного? – Sergio

+0

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

+0

hi @jdb, это именно то, что я делаю прямо сейчас (используя Javassist), но трудно взаимодействовать с другими фреймворками (такими как Hibernate) с техникой расширения исходного абстрактного класса (учитывая, что и моя библиотека, и Hibernate хотят использовать одно и то же t классов). Отсюда мой вопрос о том, как я могу изменить исходный класс. К сожалению, неспособность добавлять новые методы в класс является для меня сильным ограничением, поэтому API Attach API по-прежнему не выглядит идеальным решением :( – Sergio