5

ASMまたはのようなライブラリを使用して、cglibバイトコード命令をクラスに追加して、クラス フィールドの値が設定されるたびにコードを実行する方法はありますか?

たとえば、次のクラスがあるとします。


   public class Person
   {  
       bool dirty;
       public String name;
       public Date birthDate;
       public double salary;
   }

コードのセクションに次の行が含まれているとします。

person.name = "Joe";

dirtyフラグが に設定されるように、この命令をインターセプトする必要がありtrueます。クラスメソッドはバイトコード操作によって変更できるため、セッターメソッドでこれが可能であることはわかっていますが、フィールドperson.setName (“Joe”)に対しても同じことをしたいと考えています。

これは可能です

編集

クラスにアクセスするコード セクションの変更を避けたいので、傍受コードをクラスの一部として保持する方法を探していPersonます。Python クラスのプロパティに似た、フィールド アクセス用の疑似メソッドはありますか?

4

2 に答える 2

4

フィールドを更新するための 2 つのバイトコードがあります:putfieldputstatic( http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc11.htmlを参照) これらは using クラスのコードにあるため、単純に変更する方法はありませんPerson

于 2010-11-17T17:57:15.083 に答える
0

つまり、対象のメソッドで次の処理を行うバイトコードを挿入する必要があります。

if (person.name.equals("Joe") { 
   dirty = true;
}

インストルメンテーション時にフィールドを評価することはできません。メソッドの実行時に実行時に評価する必要があります。

方法に関する質問については、次のことを試してください。

  • コードをテスト クラスに記述し、バイトコードの ASCII バージョンを生成して、何が生成されたかを確認します。で簡単にできますjavap
于 2010-11-16T19:38:31.927 に答える