2012-10-11 15 views
6

私はJavaエージェントで初心者です。 私は(プレイからスニッフィングフレームワーク!)シンプルHotswapAgentクラスを作成しました:Javaエージェントは "redefineClassesはこの環境ではサポートされていません"と報告しています

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

そして、私はこのように、新しいクラス定義をリロードしてみてください:このマニフェストでは

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

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があります。

関連する問題