2012-11-10 10 views
11

मैंने अपनी खुद की एनोटेशन बनाई है, जिसे मैं अपने कोड में निर्णय लेने के लिए प्रतिबिंब के माध्यम से उपयोग करता हूं। एनोटेशन के एकमात्र तत्व के लिए एक डिफ़ॉल्ट मान सेट है। क्या कोई तरीका है कि मैं प्रतिबिंब के माध्यम से डिफ़ॉल्ट मान का उपयोग कर सकता हूं?जावा में एनोटेशन से डिफ़ॉल्ट तत्व मान प्राप्त करें

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#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

समाधान वापस लौट रहा है; मैं यह सुनिश्चित करने के लिए जांच कर रहा हूं कि यह मेरा नहीं है। क्या यह कोड आप भाग गए हैं? –

+0

मैंने एक परीक्षण कार्यक्रम लिखा, जो सफलतापूर्वक चलता है: http://pastie.org/5356931 – Vulcan

+1

मैंने अभी इसे समझ लिया और आपके पेस्ट ने इसकी पुष्टि की। आपको कक्षा को स्थिर तरीके से प्राप्त करने की आवश्यकता है। 'पेजेबल RequestMapping.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

मैंने इसे डाउनवॉइड किया क्योंकि यह संपादित करने से पहले, यह सही ढंग से काम नहीं करता था। हालांकि यह अब काम करता है, यह बहुत मजबूत नहीं है। ओपी ने उल्लेख किया कि वह मूल्य को स्थिर (जैसे 'MAPPING_DEFAULT') में संग्रहीत कर सकता है, और बस उस मान तक पहुंच सकता है। आपके समाधान के लिए एक निरंतर की तुलना में तर्कसंगत रूप से अधिक अवांछित अव्यवस्था की आवश्यकता होती है। – Vulcan