6

私はJavaエージェントの初心者です。シンプルな HotswapAgent クラスを作成しました (Play! フレームワークからスニッフィング):

  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 とうまく連携します。

どうしたの?

4

1 に答える 1

2

ドキュメントによると:

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マニフェスト宣言に問題があるかどうかを確認してみてください。

実行時のaddCapabilityの例を次に示します。

于 2012-10-15T09:05:35.477 に答える