2016-11-04 4 views
2

ByteBuddyを使用してString.classやInteger.classなどのjava.langパッケージのクラスを再定義しようとしていますが、成功しません。私の質問はそれが可能なのだろうか?ByteBuddyでjava.langクラスを再定義する

これは私が私のJavaエージェントにしようとしているコードです:

public static void premain(String agentArgs, Instrumentation inst) { 
    new AgentBuilder.Default() 
      .type(named("java.lang.String")) 
      .transform((builder, typeDescription, classLoader) -> 
        builder.method(named("toString")) 
          .intercept(FixedValue.value("toString() got hacked!"))) 
      .with(AgentBuilder.Listener.StreamWriting.toSystemOut()) 
      .with(AgentBuilder.RedefinitionStrategy.REDEFINITION) 
      .with(AgentBuilder.TypeStrategy.Default.REDEFINE) 
      .installOn(inst); 
} 

私は、ログの出力をチェックして、私はStringクラスについて参照するとき:

[Byte Buddy] IGNORE [[Ljava.lang.String; [null, null] 
[Byte Buddy] COMPLETE [[Ljava.lang.String; [null, null] 

いこれは、ByteBuddyがStringクラスを再定義していないことを意味しますか?それも可能ですか?

多くのありがとうございます。

答えて

2

はい、バイト・バディはどのクラスでも再定義できますが、デフォルトではブートストラップ・クラスは無視されます。あなたは、整合を無視するか、単にalltogetherそれを削除するカスタムを定義することで、このデフォルト設定を上書きすることができます。

AgentBuilder agentBuilder = new AgentBuilder.Default().ignore(none()); 

しかし私は強くブートストラップ・クラスで、特にStringクラスをいじりに対するあなたをアドバイスします。多くのコードは、toStringクラスについて強力な前提をしています。

ほとんどのJVMでは、クラスを再定義するときにクラスファイル形式を変更できないため、.disableClassFormatChanges()オプションを有効にする必要があります。そうすることで、標準のインターセプタの代わりにAdviceクラスを使用して調べる必要があるメソッドやフィールドを追加することができなくなります。

関連する問題