redefine 和 retransform 的共同点之处:两者都是对已经加载的类(already loaded classes)进行修改。
时间不同
在 Instrumentation
类版本演进的过程中,先有 redefine,后有 retransform。
在 Java 1.5 的时候(2004.09),retransform 的概念还没有出现:
public interface Instrumentation {
// Since 1.5
boolean isRedefineClassesSupported();
// Since 1.5
void addTransformer(ClassFileTransformer transformer);
// Since 1.5
void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException;
}
到 Java 1.6 的时候(2006.12),才有了 retransform 相关的内容:
public interface Instrumentation {
// Since 1.6
boolean isRetransformClassesSupported();
// Since 1.6
void addTransformer(ClassFileTransformer transformer, boolean canRetransform);
// Since 1.6
void retransformClasses(Class<?>... classes) throws UnmodifiableClassException;
}
处理方式不同:替换和修改
- redefine 是进行“替换”
- retransform 是进行“修改”
The main difference seems to be that when we redefine
a class, we supply a byte[]
with the new definition out of the blue,
whereas when we retransform
, we get a byte[]
containing the current definition via the same API, and we return a modified byte[]
.
Therefore, to redefine
, we need to know more about the class.
With retransform
you can do that more directly: just look at the bytecode given, modify it, and return it.
影响范围不同:transformer
redefine 操作会触发:
- retransformation incapable transformer
- retransformation capable transformer
retransform 操作会触发:
- retransformation capable transformer
总结
本文内容总结如下:
- 第一点,redefine 和 retransform 的共同之处:两者都是处理已经加载的类(already loaded classes)。
- 第二点,redefine 和 retransform 的不同之处:出现时间不同、处理方式不同、影响范围不同。