2

方法 ClassFileTransformer.transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) 的 J2SE 5.0 规范告诉:

每一个新的类定义和每一个类的重新定义都会调用transformer。使用 ClassLoader.defineClass 请求新的类定义。使用 Instrumentation.redefineClasses 或其本机等效项提出类重定义请求。在验证或应用类文件字节之前,在处理请求期间调用转换器。

使用这些信息,我不能说是否可以为同一个运行时类(classLoader&className)同时调用方法 ClassFileTransformer.transform。我知道可以为同一个类同时调用 Instrumentation.redefineClasses 方法,但这并不意味着这样的调用会导致对同一个类同时调用 ClassFileTransformer.transform。有什么办法可以澄清我的不理解吗?

这对我来说很重要,因为我使用 Javassist 进行转换,并且可以从同时运行的方法 ClassFileTransformer.transform 中使用相同的 CtClass 实例。目前我在 synchronized(ctClass) 块中使用 CtClass 实例,以防万一。

4

1 回答 1

0

我只是尝试Instrumentation.redefineClasses为同一个类同时调用方法,并检查我的类文件转换器transform方法是否被同时调用。答案是肯定ClassFileTransformer.transform的,JVM 可以同时为同一个类调用方法。

于 2012-10-17T02:22:28.840 回答