public interface ClassFileTransformer
注意空类文件长期使用在The Java™ Virtual Machine Specification 3.1节定义,意味着在类文件格式的字节序列,无论他们居住在一个文件。
Modifier and Type | Method and Description |
---|---|
byte[] |
transform(ClassLoader loader, String className, 类<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
此方法的实现可能会改变提供的类文件,并返回一个新的替换类文件。
|
byte[] transform(ClassLoader loader, String className, 类<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
有两种类型的变压器,通过Instrumentation.addTransformer(ClassFileTransformer,boolean)
canRetransform
参数的确定:
canRetransform
为真canRetransform
虚假或者加入Instrumentation.addTransformer(ClassFileTransformer)
一旦变压器已注册addTransformer
,变压器将被称为每一个新的类定义,每类定义。变压器改造能力也将称为每类转型模式。一个新的类定义的请求与ClassLoader.defineClass
或本地的等价物了。一个类定义的请求与Instrumentation.redefineClasses
或本地的等价物了。一类再请求与Instrumentation.retransformClasses
或本地的等价物了。该变压器被称为在处理过程中的请求,之前的类文件字节已被验证或应用。当有多个变压器,转换是由链接transform
电话。这是字节数组返回一个叫transform
成为输入(通过classfileBuffer
参数)到下一个电话。
变换应用于以下顺序:
对于retransformations逆变器的变压器,不能不叫,而不是以前的转换结果是重复使用。在所有其他情况下,这种方法被称为。在每一个这些分组中,变压器被称为注册的顺序。本地的变压器是由java虚拟机工具接口的ClassFileLoadHook
事件提供)。
输入(通过classfileBuffer
参数)的第一个变压器:
ClassLoader.defineClass
字节definitions.getDefinitionClassFile()
哪里definitions
是Instrumentation.redefineClasses
参数Instrumentation.retransformClasses
如果执行方法确定没有转变是必要的,它应该返回null
。否则,它应该创建一个新的byte[]
阵列,复制输入classfileBuffer
进去,连同所有所需的转换,并返回新数组。输入classfileBuffer
必须修改。
在变换和重新定义的情况下,变压器必须支持重新定义的语义:如果一个类中定义了初始变压器后再转化或重新定义,变压器必须确保第二类输出类文件是第一输出的类文件的法律界定。
如果变压器抛出一个异常(它不抓),随后仍将被称为变压器的负荷,重新定义或变换仍然会尝试。因此,抛出一个异常具有相同的效果,还null
。为了防止意外行为时未检查的异常是变压器产生编码,变压器可以赶上Throwable
。如果变压器认为classFileBuffer
并不代表一个有效的格式化类文件,它会抛出一个IllegalClassFormatException
;而这具有相同的效果,返回null。它有利于测井或腐败的调试格式。
loader
-定义的类装载机进行改造,可
null
如果引导装入程序
className
-完全合格的类和接口名称为nulljava虚拟机规范定义的内部形式的类的名称。例如,
"java/util/List"
。
classBeingRedefined
-如果这是一个重新定义或逆变触发,班级被重新定义或转化;如果这是一类负荷,
null
protectionDomain
-被定义或重新定义了类的保护域
classfileBuffer
-类文件格式的输入字节缓冲区必须修改
null
如果没有变换操作。
IllegalClassFormatException
-如果输入不代表一个良好的类文件
Instrumentation.redefineClasses(java.lang.instrument.ClassDefinition...)
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.