1

これはかなり奇妙ですが、私は本当にこれが必要です...私はこのコードを持っています

@Aspect
public class SomeAspect {

    SomeObject someObject = null;

    @Pointcut("something")
    public void somePoint() {
    }

    @Before("somePoint()")
    public void beforeSomePoint() {
    }

    @After("somePoint()")
    public void afterSomePoint() {
        someObject.hello();
    }

    public void waitForEvent(SomeEvent event) {
        someObject = event.getObject();
    }
}

つまり、基本的にポイントカットと 2 つのアドバイスがあります。アプリケーションで発生するイベントをリッスンするメソッドがあります。興味のあるイベントからオブジェクトを取得し、メソッドsomeObjectで変数を初期化しますwaitForEvent。これは機能し、メソッドsomeObjectに正しく渡されると確信しています。waitForEvent

ポイントは、アドバイスメソッドの本体で取得したオブジェクトを操作する必要があるというsomeObject.hello()ことですが、アドバイスの実際の実行前にイベントが発生することを知っていても、まだnullのようですafterSomePoint

Spring やその他の関連するフレームワークは使用していません。純粋な Java + AspectJ、注釈付きバージョンを使用しています。

オブジェクトを外部からアドバイスに渡すにはどうすればよいですか?

本当にありがとうございました

4

2 に答える 2

1

こんにちは、someObj がまだ null であると確信していますか?

これが私の実験の結果です:

someObject を String に変更します。

@Aspect
public class SomeAspect {

    String someObject = null;

    @Pointcut("Call( * init(..) )")
    public void somePoint() {
    }

    @Before("somePoint()")
    public void beforeSomePoint() {
    }

    @After("somePoint()")
    public void afterSomePoint() {
        System.out.println(someObject);
    }

    public void waitForEvent(String event) {
        someObject = event;
    }
}

私のメインプログラムでは:

public static void main(String[] args) {

SomeAspect a = Aspects.aspectOf(SomeAspect.class);
a.waitForEvent("Event!!");

Child c = new Child();
c.init(); //The advice will be triggered here!!

}

このように、 afterSomePoint() アドバイスがトリガーされ、「イベント!!」印刷されます

Aspects.aspectOf(SomeAspect.class) を使用してアスペクト インスタンスを取得し、それをフレームワークに渡すことができると思います。SomeAspect を新規作成すると、VM に既に存在するインスタンスとは別に別のインスタンスが作成されます

参照: eclipse.org/aspectj/doc/next/progguide/semantics-aspects.html

クラス式とは異なり、アスペクトは新しい式でインスタンス化されません。むしろ、アスペクト インスタンスは自動的に作成され、プログラムを横断します。プログラムは、静的メソッドspectOf(..)を使用して、アスペクト インスタンスへの参照を取得できます。

于 2013-07-17T13:47:20.193 に答える
0

ああ、これはとても面白いです...

その変数を静的にしただけで、うまくいくようです。これは何かの魔法ですか?やり方はこれでいいのでしょうか?他に方法はありますか?

@Aspect
public class SomeAspect {

    private static SomeObject someObject = null;

    @Pointcut("something")
    public void somePoint() {
    }

    @Before("somePoint()")
    public void beforeSomePoint() {
    }

    @After("somePoint()")
    public void afterSomePoint() {
        SomeAspect.someObject.hello();
    }

    public void waitForEvent(SomeEvent event) {
        SomeAspect.someObject = event.getObject();
    }
}
于 2013-07-15T00:36:27.237 に答える