2012-11-10 6 views
11

自分の注釈を作成しました。これをリフレクションを使用して自分のコードで決定します。注釈の唯一の要素に設定されたデフォルト値があります。リフレクションによってデフォルト値にアクセスする方法はありますか?デフォルト値を取得するためにJavaの注釈からデフォルトの要素値を取得

PageableRequestMapping.java(注釈)

package org.tothought.controllers.annotations; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface PageableRequestMapping { 
    String variablePath() default "/"; 
} 

擬コード

private int parsePageNumber(StringBuffer requestURL, 
     PageableRequestMapping pageableRequestMapping) { 

     String variablePath = pageableRequestMapping.variablePath(); 

    //Psuedo code doesn't work in Java, included to illustrate intentions 
     if(variablePath.equalsIgnoreCase(pageableRequestMapping.variablePath().default())){ 
      //handle default case  
     }else{ 
      //handle different case 
     } 
     return 0; 
} 

問題の私の研究は何の例を上げていません。私はこの値がクラスを通して静的な方法でアクセスできると理論化しましたが、それはできません。だから私は2つの質問が残されています。

  • アノテーション内の要素のデフォルト値を取得することはできますか?
  • もしそうなら、どうですか?

また、私はこの値をハードコードすることができますが、プログラムをやや頑強にしたいと思います。

答えて

13

あなたはMethodオブジェクトを取得するためにリフレクションを使用して、Method#getDefaultValue()を利用することができます。ここで

Method method = pageableReqMapping.annotationType().getMethod("variablePath"); 
String variablePath = (String) method.getDefaultValue(); 

は、具体的な例を示します

public class AnnotationTest { 

    public static void main(String[] args) throws Exception { 
    Class<?> clazz = Annotation.class; 
    Method method = clazz.getDeclaredMethod("value"); 
    String value = (String) method.getDefaultValue(); 
    System.out.println(value); 
    } 

    public @interface Annotation { 
    String value() default "default value"; 
    } 
} 
+0

解決方法はnullを返します。私はそれが私ではないことを確認しています。あなたはこのコードを実行しましたか? –

+0

私は正常に実行されるテストプログラムを書いた:http://pastie.org/5356931 – Vulcan

+1

私はちょうどそれを考え出し、あなたのペーストはそれを再確認した。クラスを静的に取得する必要があります。 'pageableRequestMapping.getClass'の代わりに' PageableRequestMapping.class'を使う必要があります。なぜインスタンスからクラスを取得するのがクラスに静的にアクセスするのかとは異なるのだろうか。偉大な答えをありがとう、私はそれを感謝します。 –

1

あなたはクラスであなたの注釈を適用し、反射によってクラスからそれを取得することによって、このようにそれを行うことができます。

@PageableRequestMapping 
class MyUtilClass{ 
} 


public String getDefaultValue(){ 
    PageableRequestMapping pageableRequestMapping = MyUtilClass.class.getAnnotation(PageableRequestMapping.class); 
    return pageableRequestMapping.variablePath(); 
} 
+0

OPは '/'、 'test'ないで注釈のデフォルト値を取得する方法を求めています。 – Vulcan

+0

私は知っている、これは私が言っているすべてのアプローチであり、それは絶対にそれをマークする必要はありませんので、動作します。 –

+0

私はそれを編集する前に正しく動作しなかったので、それを下げました。これは今でも機能しますが、それほど堅牢ではありません。 OPは、(MAPPING_DEFAULTのように)定数に値を格納し、その値に単にアクセスできると述べました。あなたの解決策は、定数よりもむしろ望ましくないクラッタを必要とします。 – Vulcan