Spec-Zone .ru
спецификации, руководства, описания, API
|
public interface ClassFileTransformer
Отметьте, что файл класса термина используется как определено в разделе 3.1 из Спецификации Виртуальной машины Java™, чтобы означать последовательность байтов в формате файла класса, находятся ли они в файле.
Модификатор и Тип | Метод и Описание |
---|---|
byte[] |
transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
Реализация этого метода может преобразовать предоставленный файл класса и возвратить новый заменяющий файл класса.
|
byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
Есть два вида преобразователей, определенных canRetransform
параметр Instrumentation.addTransformer(ClassFileTransformer,boolean)
:
canRetransform
как истина canRetransform
как ложь или где добавлено с Instrumentation.addTransformer(ClassFileTransformer)
Как только преобразователь был зарегистрирован в addTransformer
, преобразователь вызовут для каждого нового определения класса и каждого переопределения класса. Перепреобразование способные преобразователи также вызовут на каждом перепреобразовании класса. С просьбой на новое определение класса обращаются ClassLoader.defineClass
или его собственные эквиваленты. С просьбой на переопределение класса обращаются Instrumentation.redefineClasses
или его собственные эквиваленты. С просьбой на перепреобразование класса обращаются Instrumentation.retransformClasses
или его собственные эквиваленты. Преобразователь вызывают во время обработки запроса, прежде, чем байты файла класса были проверены или применены. Когда есть многократные преобразователи, преобразования составляются, объединяя в цепочку transform
вызовы. Таким образом, байтовый массив возвратился одним звонком transform
становится вводом (через classfileBuffer
параметр) к следующему вызову.
Преобразования применяются в следующем порядке:
Для перепреобразований перепреобразования неспособные преобразователи не вызывают, вместо этого результат предыдущего преобразования снова используется. Во всех других случаях вызывают этот метод. В пределах каждой из этих группировок преобразователи вызывают в зарегистрированном порядке. Собственные преобразователи обеспечиваются ClassFileLoadHook
событие в Интерфейсе Инструмента виртуальной машины Java).
Ввод (через classfileBuffer
параметр) к первому преобразователю:
ClassLoader.defineClass
definitions.getDefinitionClassFile()
где definitions
параметр к Instrumentation.redefineClasses
Instrumentation.retransformClasses
Если метод реализации решает, что никакие преобразования не необходимы, он должен возвратиться null
. Иначе, это должно создать новое byte[]
массив, скопируйте ввод classfileBuffer
в это, наряду со всеми требуемыми преобразованиями, и возвратом новый массив. Ввод classfileBuffer
не должен быть изменен.
В перепреобразовании и пересматривают случаи, преобразователь должен поддерживать семантику переопределения: если класс, что преобразователь, измененный во время начального определения, позже повторно преобразовывается или пересматривается, преобразователь, должен обеспечить, чтобы второй файл выходного класса класса был юридическим переопределением первого файла выходного класса.
Если преобразователь выдаст исключение (который он не ловит), то последующие преобразователи все еще вызовут и загрузка, пересмотрят, или перепреобразование будет все еще предпринято. Таким образом выдача исключения имеет тот же самый эффект как возврат null
. Чтобы предотвратить неожиданное поведение, когда исключения непроверенные сгенерированы в коде преобразователя, преобразователь может поймать Throwable
. Если преобразователь верит classFileBuffer
не представляет законно отформатированный файл класса, он должен бросить IllegalClassFormatException
; в то время как это имеет тот же самый эффект как возврат нуля. это облегчает журналирование или отладку повреждений формата.
loader
- загрузчик определения класса, который будет преобразован, может быть null
если программа начальной загрузкиclassName
- имя класса во внутренней форме полностью определенного класса и интерфейса называет как определено в Спецификации виртуальной машины Java. Например, "java/util/List"
.classBeingRedefined
- если это инициировано пересматриванием, или повторно преобразуйте, класс, пересматриваемый или повторно преобразованный; если это - загрузка класса, null
protectionDomain
- домен защиты класса, определяемого или пересмотренногоclassfileBuffer
- входной буфер байта в формате файла класса - не должен быть измененnull
если никакие не преобразовывают, выполняется.IllegalClassFormatException
- если ввод не представляет правильно построенный файл классаInstrumentation.redefineClasses(java.lang.instrument.ClassDefinition...)
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.