2012-10-11 37 views
6

我是java代理的新手。 我创建了一个简单的HotswapAgent类(来自Play嗅探框架!):Javaagent报告“redefineClasses在此环境中不受支持”

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); 

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

redefineClasses is not supported in this environment 

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

JVM是标准的MacOS X Java 1.6 VM。这个JVM与JRebel的效果很好,它使用相同的代理机制。

怎么了?

回答

2

按照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

相关问题