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