2012-11-10 34 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; 
} 

我的問題的研究結果顯示,沒有實例。我推理這個值可以通過類以靜態方式訪問,但它不能。所以我剩下兩個問題。

  • 是否有可能獲得註釋中元素的默認值?
  • 如果是這樣,怎麼樣?

另外,我知道我可以硬編碼這個值,但是我想讓程序稍微更健壯。

回答

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