0

オブジェクトのプライベート フィールドの名前を取得しようとしています。パッケージのパブリック フィールドに同じポイント カットを使用すると、正しく機能します。私のアスペクトは特権に設定されています。クラスのオブジェクトが更新されるフィールドが必要です。ポイントカット:

pointcut priv(Object v): target (v)&& !(call(new(..)))  && set(private * *.*) 

アドバイス:

after(Object v): priv(v)

ポイントカット例外内のこの行で例外が発生します。

Object dt = dts.getDeclaringType().getField(dts.getName());
4

1 に答える 1

2

まず第一に、ポイントカットはポイントカットsetと同じになることは決してないため、ポイントカットは意味がありません。したがって、callポイントカットを除外する必要はありません。コンストラクターでメンバーの割り当てを除外する場合は、コンストラク!cflow(execution(*.new(..)))ター内の制御フローを除外するようなものが必要です。これは単なる例です。コンストラクターが、おそらく除外したくないメンバーが変更されたメソッドを呼び出す可能性がある場合は、除外基準をより正確に指定する必要があります。

v第二に、バインドされた targetを呼び出すのはかなり見苦しいと思いtargetますt。ただし、値をターゲットではなく にバインドする場合は、とにかくv使用する必要があります。args(v)

今あなたの実際の問題: Javadoc が明示的に言うように、getFieldパブリック フィールドでのみ動作します。したがって、プライベート フィールドにアクセスする必要がある場合は、 を使用してくださいgetDeclaredField

于 2013-03-15T13:24:16.707 に答える