2012-11-10 32 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