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

영업 이익은 /'이 아닌'test''인 주석의 기본값을 검색하는 방법을 요구하고있다. – Vulcan

+0

나는 이것이 내가 말하고있는 접근법이며, 그것을 작동 시켜서 그것을 표시 할 필요가 전혀 없다는 것을 알고있다. –

+0

내가 편집하기 전에 제대로 작동하지 않았기 때문에 그것을 downvoted. 지금은 작동하지만 너무 강력하지는 않습니다. OP는 그가 (MAPPING_DEFAULT와 같이) 상수에 값을 저장할 수 있고 단순히 그 값에 접근 할 수 있다고 언급했다. 당신의 솔루션은 상수보다 논리적으로 바람직하지 않은 혼란을 요구합니다. – Vulcan