3

実装バーを備えたインターフェイス Foo があります。インターフェイス Foo には、メソッド アノテーション @Secured を持つメソッド「doMe()」があります。これは、保護されている唯一の方法です。

ここで、クラスを調べて @Secured を含むメソッドを探す次のコードを書きました。(このメソッドはまだ完成していません。最初の単体テストを通過させようとしています。)

  /**
   * Determine if a method is secured
     * @param method the method being checked
     * @return true if the method is secured, false otherwise
     */
    protected static boolean isSecured(Method method) {
  boolean secured = false;
  Annotation[] annotations = method.getAnnotations();
  for(Annotation annotation:annotations){
    if(Secured.class.equals(annotation.getClass())){
      secured = true;
      break;
    }
  }

  if(secured){
    return true;
  }

  return secured;
}

doMe() 以外のメソッドは、Foo と Bar の両方の getAnnotations() で 0 メンバーを返します。問題は、doMe() が Foo と Bar の両方に対して 0 メンバーを返すことです。

私よりもリフレクションについて詳しい人を探しています。見つけるのは難しくないはずです。:)

ありがとう。

4

2 に答える 2

6

実行時に注釈が表示されることを確認しましたか? で注釈を付ける必要がある場合があります@Retention(RetentionPolicy.RUNTIME)。デフォルトの はCLASS、リフレクティブ メソッドで注釈を返しません。

参照: RetentionPolicy ドキュメント

于 2012-10-22T15:11:36.797 に答える
2

内部では を使用しているため、getAnnotationの代わりに使用してみてください。getAnnotationsgetAnotationsgetDeclaredAnnotations

詳細については、メソッド (Java Platform SE 6)を参照してください。

protected static boolean isSecured(Method method) {

        Secured secured = method.getAnnotation(Secured.class);

        return secured == null ? false : true;
    }
于 2012-10-22T15:35:21.177 に答える