2

特定の Java クラスでメソッドが呼び出されるたびに実行したいコードがいくつかありますが、実際のメソッド本体には触れたくありません。これは、頻繁に変更されるメソッドが多数あり、これらのメソッドをプログラミングする人は、別のメソッドを呼び出す 1 行だけであっても、すべてのメソッドにコードを追加することを心配する必要がないためです。

継承でこれを実現する方法が思いつかないので、リフレクションで可能かどうか疑問に思っていましたか? それともまったく?

クラス内のメソッドのリストを取得し、それらのプロパティを調べて、それらを呼び出すことさえ可能です。しかし、イベント ハンドラーなど、追加のコードを追加できるものは何も見当たりません。たぶん、Javaはこのようなものには間違った言語です..

4

2 に答える 2

1

これは非常に一般的な動作であり、アスペクト指向プログラミングが間違いなく適切に使用されます。

しかし、有名な CMS のやり方にも感銘を受けました。

具体的なメソッドを含むクラスごとに、メソッド呼び出しの前に実行するコードを含むプロパティ (メソッドのリスト) を持つことができます。

registerBeforeCall(Method m)メソッドを受け取り、リストに追加するメソッドを作成できます。

メソッドの最初の行 (メソッドのリストを通過する) に for ループを含め、各メソッドを 1 つずつ呼び出す必要があります。

呼び出しに例外がある場合は、try と catch を入れて例外を無視することを忘れないでください。

例:

public void myActualMethod(){
    for(Method m : registeredMethodsToCallBeforeActualCode){
        m.invoke();
    }

    //my actual code

    // here you can also write a for loop to execute all the methods which you want to call after your actual code is executed.

}

このアプローチは特別なものではありませんが、AOP を選択しない場合に広く使用されています。

于 2013-09-27T11:38:22.220 に答える
0

継承によって実装する 1 つの方法は次のとおりです。

    public SuperClass {

       public void doSomething() {
          doBefore();
          doSpecific();
          doAfter();
       }

       protected abstract void doSpecific();

    }

    public SubClass extends SuperClass {
       protected void doSpecific() {
          System.out.println("Do specific implementation....");
       }
    }


public static void main(String[] args) {
   SuperClass clazz = new SubClass();
   clazz.doSomething();
}
于 2013-09-27T10:06:26.120 に答える