2011-08-29 10 views
6

इस कोड पर विचार करें:जावा में प्रतिबिंब के माध्यम से विधि तर्क का मूल्य कैसे प्राप्त करें?

public void example(String s, int i, @Foo Bar bar) { 
    /* ... */ 
} 

मुझे @Foo के साथ एनोटेटेड तर्क के मूल्य में रूचि है। मान लीजिए कि मैंने पहले से ही प्रतिबिंब (Method#getParameterAnnotations() के साथ) के माध्यम से पता लगाया है कि विधि पैरामीटर में @Foo एनोटेशन है। (मुझे पता है कि यह पैरामीटर सूची का तीसरा पैरामीटर है।) Xzx19

अब मैं आगे के उपयोग के लिए bar का मान कैसे प्राप्त कर सकता हूं?

+3

साथ एनोटेशन आधारित सत्यापन का उपयोग करते हुए मैं सवाल नहीं मिलता है आरंभ करने के लिए एक नमूना पहलू है। 'बार' का मान केवल रनटाइम के दौरान उपलब्ध होगा। क्या आप 'उदाहरण' पर कॉल को अवरुद्ध करना चाहते हैं? या क्या आपका मतलब डेटाटाइप 'बार' है? – home

उत्तर

11

आप नहीं कर सकते। प्रतिबिंब में विधि चरम सहित स्थानीय चरों तक पहुंच नहीं है। ,

  • AOP (AspectJ/स्प्रिंग AOP आदि)
  • प्रॉक्सी (JDK:

    आपको लगता है कि कार्यक्षमता चाहते हैं, आप विधि कॉल है, जो आपको कई तरीकों में से एक में कर सकते हैं अवरोधन करने की जरूरत है CGLib आदि)

इन सभी में, आप विधि कॉल से पैरामीटर एकत्र करेंगे और फिर विधि कॉल निष्पादित करने के लिए बताएंगे। लेकिन प्रतिबिंब के माध्यम से विधि पैरामीटर पर जाने का कोई तरीका नहीं है।

अद्यतन: यहाँ आप AspectJ

public aspect ValidationAspect { 

    pointcut serviceMethodCall() : execution(public * com.yourcompany.**.*(..)); 

    Object around(final Object[] args) : serviceMethodCall() && args(args){ 
     Signature signature = thisJoinPointStaticPart.getSignature(); 
     if(signature instanceof MethodSignature){ 
      MethodSignature ms = (MethodSignature) signature; 
      Method method = ms.getMethod(); 
      Annotation[][] parameterAnnotations = 
       method.getParameterAnnotations(); 
      String[] parameterNames = ms.getParameterNames(); 
      for(int i = 0; i < parameterAnnotations.length; i++){ 
       Annotation[] annotations = parameterAnnotations[i]; 
       validateParameter(parameterNames[i], args[i],annotations); 
      } 
     } 
     return proceed(args); 
    } 

    private void validateParameter(String paramName, Object object, 
     Annotation[] annotations){ 

     // validate object against the annotations 
     // throw a RuntimeException if validation fails 
    } 

} 
+0

मैं पहले से ही AspectJ का उपयोग कर रहा हूं, लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिला है। यह पहला प्रश्न था: http://stackoverflow.com/questions/7228590/how-to-check-if-a-parameter-of-the-current-method-has-an-annotation-and-retrieve – soc

+0

@soc ठीक है, स्टार्टर्स के लिए मेरा अपडेट देखें, [एस्पेक्टजे इन एक्शन] (http://www.manning.com/laddad2/) वास्तव में सीखें कि यह कैसे करें (या [AspectJ उपयोगकर्ता सूची] पर प्रश्न पूछें (http://www.eclipse.org/aspectj/userlists.php) –

+0

अरे धन्यवाद! :-) मैंने पहले से ही पुस्तक खरीदी है, लेकिन मैंने सब कुछ मैच हस्ताक्षर में डालने की कोशिश की, जो काम नहीं किया ... – soc

संबंधित मुद्दे