2012-10-11 18 views
6

Soy un novato en los agentes de Java. creé una clase HotswapAgent sencilla (sniffing de Play marco!):Javaagent informa que "redefineClasses no es compatible con este entorno"

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

Con este manifiesto:

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

y trato de volver a cargar una nueva definición de clase, de esta manera:

CtClass modelClass = .... 

... 

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

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

Todas estas clases están en un jar, y finalmente obtengo este error (en la llamada a reload()):

redefineClasses is not supported in this environment 

Pero en Manifiesto se declara Can-Redefine-Classes: true.

La JVM es una MacOS X Java 1.6 VM estándar. Esta JVM funciona bien con JRebel, que usa el mismo mecanismo de agente.

¿Qué pasa?

Respuesta

2

De acuerdo con la 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. 

Usted puede tratar de addCapability para comprobar si hay un problema con la declaración de manifiesto.

Aquí hay un example of addCapability in runtime.

Cuestiones relacionadas