1

私は次のインターフェースを持っています:

public interface AG {
    @Params(param = {"user","userN"})
    public String addUse(){}
}

さて、リフレクションで注釈を取得したいので、次のように書きました。

    Method[] methods = AG.class.getDeclaredMethods();
    for (int i = 0; i<methods.length; i++){
        String name = methods[i].getName();
        if (name.equals("addUse")){
            Method method = methods[i];
            Annotation[] annotaions = method.getAnnotations();}}

注釈が空のセットであることがわかります (メソッドが の場合addUse)。その理由は何ですか?

4

1 に答える 1

3

コードは、実行時のイントロスペクションにアクセスできる適切な保持ポリシーを持つ注釈に対してのみ機能します。RUNTIME特に、次のようにする必要があります。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Params {
...

名前が示すように、保持ポリシーは、対応するバイトコードを使用して、アノテーションに関する情報をいつまで保持するかを決定します。

これは、理論的には、CLASS-retention アノテーションVM によって利用可能になる可能性があることを意味することに注意してください。ただし、実際にはそうではありません (確かに Oracle JVM ではそうではありません)。

于 2013-09-02T08:57:22.693 に答える