【问题标题】:Javaagent reports "redefineClasses is not supported in this environment"Javaagent 报告“此环境不支持重定义类”
【发布时间】:2012-10-11 16:23:06
【问题描述】:

我是 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);
        }
    } 

有了这个清单:

Manifest-Version: 1.0
Premain-Class: path.to.HotswapAgent
Can-Redefine-Classes: true

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

CtClass modelClass = .... 

...

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

ClassDefinition cdef = new ClassDefinition(c, bcode);
HotswapAgent.reload(cdef);

所有这些类都在一个罐子里,最后我得到这个错误(在 reload() 调用上):

redefineClasses is not supported in this environment

但在 Manifest 中声明为 Can-Redefine-Classes: true

JVM 是标准的 MacOS X Java 1.6 VM。这个 JVM 与使用相同代理机制的 JRebel 配合得很好。

怎么了?

【问题讨论】:

    标签: java javaagents


    【解决方案1】:

    根据documentation

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

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

    这是example of addCapability in runtime

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多