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?