Javaagent报告"此环境不支持redefineClasses"

g.a*_*ata 6 java javaagents

我是java代理的新手.我创建了一个简单的HotswapAgent类(从Play!Framework中嗅探):

  public class HotswapAgent {
        static Instrumentation instrumentation;
        public static boolean enabled = false;

        public static void premain(String agentArgs, Instrumentation instrumentation) 
        {
             HotswapAgent.instrumentation = instrumentation;
             HotswapAgent.enabled = true;
        }

        public static void reload(ClassDefinition... definitions) 
                             throws UnmodifiableClassException, ClassNotFoundException                         
        {
            instrumentation.redefineClasses(definitions);
        }
    } 
Run Code Online (Sandbox Code Playgroud)

有了这个清单:

Manifest-Version: 1.0
Premain-Class: path.to.HotswapAgent
Can-Redefine-Classes: true
Run Code Online (Sandbox Code Playgroud)

我尝试以这种方式重新加载一个新的类定义:

CtClass modelClass = .... 

...

byte [] bcode = modelClass.toBytecode();
Class c = modelClass.toClass();
modelClass.defrost();

ClassDefinition cdef = new ClassDefinition(c, bcode);
HotswapAgent.reload(cdef);
Run Code Online (Sandbox Code Playgroud)

所有这些类都在一个jar中,最后我得到了这个错误(在reload()调用时):

redefineClasses is not supported in this environment
Run Code Online (Sandbox Code Playgroud)

但是在Manifest中宣布了Can-Redefine-Classes: true.

JVM是标准的MacOS X Java 1.6 VM.此JVM适用于使用相同代理机制的JRebel.

怎么了?

sse*_*ano 2

根据文档

Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.
Run Code Online (Sandbox Code Playgroud)

您可以尝试addCapability检查manifest声明是否有问题。

这是运行时 addCapability 的示例