4

いくつかの問題を解決するために、Webアプリケーションを調べています。アプリケーションはTomcat、Jersey、Guiceを使用します。問題の1つは、承認目的で使用されるMethodInterceptorで発生しています。関連する部分にトリミングされたメソッドは次のとおりです。

public Object invoke(MethodInvocation invoc) throws Throwable {
    // ...

    //Check that the annotation actually exists
    if(! invoc.getMethod().getDeclaringClass().isAnnotationPresent(Tool.class))
    {
        throw new BaseException("...");
    }

    // ...
}

ここで問題となるのは、「Webに面した」メソッドの一部が、子でオーバーライドされることなく、親クラスから継承されることです。getDeclaringClass()を正しく理解していれば、この場合はクラスが返されますが、ここで本当に必要なのは子クラスです。いくつかのテストはこれを確認しているようです-子クラスのメソッドをオーバーライドするとすべてが正常ですが、オーバーライドを入れないと例外がスローされます。

したがって、MethodInvocationオブジェクトが与えられた場合、メソッドが宣言されたクラスではなく、インスタンス化された「実際の」クラスにまでさかのぼる方法はありますか?または、他のアプローチが必要ですか?最悪の場合、クラスに注釈を付けるのではなく、必要に応じて各メソッドに注釈を付けることができます。

これが簡単な答えのための長い質問である場合は申し訳ありません-私のJavaはかなり錆びています。

4

2 に答える 2

8

十分に単純で、getThis().getClass()代わりに MethodInvocation で使用する必要がありますgetMethod().getDeclaringClass()

    if(! invoc.getThis().getClass().isAnnotationPresent(Tool.class))
    {
        throw new BaseException("...");
    }

私の場合、Guice は自動生成された子クラス (たとえば、"$$EnhancerByGuice..." で終わるクラス名) を配置することで少し複雑になりましたgetSuperclass()

    if(! invoc.getThis().getClass().getSuperclass().isAnnotationPresent(Tool.class))
    {
        throw new BaseException("...");
    }
于 2012-11-15T21:46:33.717 に答える
0

答えはノーのようです。それを確認するための簡単なテストを作成しました。

    class Run implements Runnable {
        @Override
        public void run() {
        }
    }
    class Run2 extends Run{}
    Method method = Run2.class.getMethods()[0];
    System.out.println(method);

デバッグ ウィンドウでわかるように、メソッドにはクラス Run2 の情報がありません。

デバッグ ウィンドウのメソッド

これらのメソッドが呼び出される実際のクラス インスタンスではなく、アノテーションを使用して実際のメソッドに固執する方がよいと思います。

于 2012-11-15T22:27:44.837 に答える