37

次の注釈のインスタンスを作成するにはどうすればよいですか (すべてのフィールドがデフォルト値に設定されています)。

    @Retention( RetentionPolicy.RUNTIME )
    public @interface Settings {
            String a() default "AAA";
            String b() default "BBB";
            String c() default "CCC";
    }

試してみnew Settings()ましたが、うまくいかないようです...

4

7 に答える 7

40

インスタンスを作成するには、以下を実装するクラスを作成する必要があります。

例えば: public class MySettings implements Annotation, Settings

ただし、インターフェイスの正しい実装equalsとインターフェイスhashCodeに応じて、特別な注意を払う必要がありAnnotationます。 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/Annotation.html

これを何度も実装したくない場合は、javax.enterprise.util.AnnotationLiteralクラスを参照してください。これは CDI (Context Dependency Injection)-API の一部です。 (@コードを参照)

デフォルト値を取得するには、akuhn (以前の名前: Adrian) によって説明されている方法を使用できます。 Settings.class.getMethod("a").getDefaultValue()

于 2011-08-15T16:40:37.850 に答える
38

インスタンスを作成することはできませんが、少なくともデフォルト値を取得できます

Settings.class.getMethod("a").getDefaultValue()
Settings.class.getMethod("b").getDefaultValue()
Settings.class.getMethod("c").getDefaultValue()

次に、動的プロキシを使用してデフォルト値を返すことができます。これは、私が知る限り、アノテーションが Java 自体によって処理される方法でもあります。

class Defaults implements InvocationHandler {
  public static <A extends Annotation> A of(Class<A> annotation) {
    return (A) Proxy.newProxyInstance(annotation.getClassLoader(),
        new Class[] {annotation}, new Defaults());
  }
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    return method.getDefaultValue();
  }
}

Settings s = Defaults.of(Settings.class);
System.out.printf("%s\n%s\n%s\n", s.a(), s.b(), s.c());
于 2009-03-05T03:18:33.153 に答える
27

以下をコンパイルして実行すると、満足のいく結果が得られました。

class GetSettings {
    public static void main (String[] args){
      @Settings final class c { }
      Settings settings = c.class.getAnnotation(Settings.class);
      System.out.println(settings.aaa());
    }
}
于 2010-05-26T03:41:53.903 に答える
1

Settingsクラスの本体を変更する余裕がある場合は、別の解決策があります。

@Retention( RetentionPolicy.RUNTIME )
public @interface Settings {
        String DEFAULT_A = "AAA";
        String DEFAULT_B = "BBB";
        String DEFAULT_C = "CCC";

        String a() default DEFAULT_A;
        String b() default DEFAULT_B;
        String c() default DEFAULT_C;
}

次に、単純に参照できますSettings.DEFAULT_A(はい、より適切な名前が役立ちます!)。

于 2016-07-11T16:18:37.393 に答える
1

メソッドで使用する場合:

@Settings
public void myMethod() {
}

これで、注釈がデフォルト値で初期化されました。

于 2008-11-05T22:20:24.587 に答える