2

Java の外部クラス フィールド アクセスを getter/setter 呼び出しに自動的に変更し、公開されたフィールドを非表示にすることは可能ですか? 私は Javabeans を使用しており、フィールド プロパティが変更されたときに変更通知が必要です (これは重要です)。

PropertyChangeSupport フィールドにプロパティ変更呼び出しを自動的に挿入できるcglibを見つけました。Project Lombokについては知っていますが、これはソースコードを変更しているように見え、さらにフィールドアクセスの変更をサポートしていません。おそらく Lombok に変更を加えることで、これがサポートされる可能性がありますか、それとも他の解決策がありますか?

よろしくお願いします、クリス

4

2 に答える 2

1

最も簡単なオプションは、API クライアントのソースを変更することです。それがオプションではないと仮定すると、少なくともクライアント バイナリを制御し、バイトコード操作を使用できない限り、この方法でフィールドを自動的にカプセル化する方法はありません。そのレベルの制御があれば、はい、cglib がオプションになる可能性があります。ただし、バイトコード操作を行っても、java.lang.reflect.Field.set をインターセプトする方法がないため、リフレクションを使用してフィールドが変更されないことを保証する必要があります。

最善の選択肢は、API を壊してセッター/ゲッターを導入することです。これは、API を作成するときに常に適切なカプセル化を使用することを思い出させるものです。

于 2010-04-25T21:17:36.153 に答える
0

AspectJ を使用すると、通知を行うことができます。クラスのランタイム ウィービングを行ってから、誰かがインスタンス変数を変更したり、メソッドを呼び出したりしたことを検出し、必要なアクションを実行できます。
臆病者向けではありません!!!

コードを変更せずにアクセスを変更することの意味がわかりませんか?

于 2010-04-25T23:16:00.333 に答える