2012-05-08 6 views
1

私はScannotationを使ってクラスファイルをスキャンし、そのクラスのどの要素にも注釈があるすべてのクラスを取得しています。反射を使用すると、メソッド内のパラメータのすべての注釈を見つけることができましたが、後でそのパラメータを取得できるように(または何を呼び出すか)、これらの注釈のオブジェクトが必要です。Javaのメソッドまたはコンストラクタのパラメータの注釈のオブジェクトを得る

これは私のコードの一部であり、私が望む注釈が返されますが、私はこれらのコードで作業することはできません。

public Set<Class> getParametersAnnotatedBy(Class<? extends Annotation> annotation) { 
     for (String s : annotated) { 
     //annotated is set containing names of annotated classes 
        clazz = Class.forName(s); 
        for (Method m : clazz.getDeclaredMethods()) { 
         int i = 0; 
         Class[] params = m.getParameterTypes(); 
         for (Annotation[] ann : m.getParameterAnnotations()) { 
          for (Annotation a : ann) { 
           if (annotation.getClass().isInstance(a.getClass())) { 
            parameters.add(a.getClass()); 
            //here i add annotation to a set 
           } 
          } 
         } 
        } 
       } 
      } 

iは、私はそれを扱うことができます知っている私は、このような注釈、知っている場合:

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyAnnotation { 
    public String name(); 
    public int count(); 
} 
// ... some code to get annotations 
MyAnnotation ann = (MyAnnotation) someAnnotation; 
System.out.println(ann.name()); 
System.out.println(ann.count()); 

これまでのところ、私はリフレクションを使用して、このようにそれを行うことができませんでしたが... I事前にお礼を言いたいと思います。 PS:フィールドのフィールド、メソッドのメソッドなどのようなパラメータのオブジェクトを取得する方法はありますか?

答えて

1

a.annotationTypeを使用する必要があります。アノテーションでgetClassを呼び出すと、実際にはProxy Classが取得されます。実際のクラスを取得するにはgetClassの代わりにannotationTypeに電話する必要があります。

if (annotation.getClass() == a.annotationType()) { 
      parameters.add(a.annotationType()); 
      // here i add annotation to a set 
     } 
+0

少し助けてくれてありがとう。それは私の問題を実際には解決しませんでしたが、私は実現しました、それを行うより簡単な方法があります。今私はメソッド、コンストラクタ、そのパラメータと注釈のためのラッパーのいくつかの種類を作成する必要があり、これまでのところ、私はどのように考えていない... – Cviro

関連する問題