2010-10-27 15 views
9

मुझे एनोटेशन का उपयोग करके बिंदुओं के कटौती के रूप में कुछ तरीकों और उनके गुणों को घुसपैठ करने की आवश्यकता है, लेकिन मैं उन विधि विशेषताओं तक कैसे पहुंच सकता हूं। मेरे पास निम्न कोड है जो विधि चलाने से पहले कोड को सफलतापूर्वक चला सकता है, लेकिन मुझे नहीं पता कि मैं उन अभ्यर्थियों तक कैसे पहुंच सकता हूं।मैं स्प्रिंग एओपी (AspectJ-style) के साथ विधियों के गुणों का उपयोग कैसे कर सकता हूं?

package my.package; 

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class MyAspect { 

@Pointcut(value="execution(public * *(..))") 
public void anyPublicMethod() { 
} 

@Around("anyPublicMethod() && @annotation(myAnnotation)") 
public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation) 
    throws Throwable { 

    // how can I access method attributes here ? 
    System.out.println("hello aspect!"); 
    return pjp.proceed(); 
} 
} 

उत्तर

13

आप उन्हें ProceedingJoinPoint वस्तु से प्राप्त कर सकते हैं:

@Around("anyPublicMethod() && @annotation(myAnnotation)") 
public Object myAspect(final ProceedingJoinPoint pjp, 
    final MyAnnotation myAnnotation) throws Throwable{ 

    // retrieve the methods parameter types (static): 
    final Signature signature = pjp.getStaticPart().getSignature(); 
    if(signature instanceof MethodSignature){ 
     final MethodSignature ms = (MethodSignature) signature; 
     final Class<?>[] parameterTypes = ms.getParameterTypes(); 
     for(final Class<?> pt : parameterTypes){ 
      System.out.println("Parameter type:" + pt); 
     } 
    } 

    // retrieve the runtime method arguments (dynamic) 
    for(final Object argument : pjp.getArgs()){ 
     System.out.println("Parameter value:" + argument); 
    } 

    return pjp.proceed(); 
} 
+0

ठीक है अब मैं यह हो रही है, लेकिन यह अजीब पैरामीटर देता है। org.springframework.s[email protected]8c666a org.springframework.security.web.context.Ht[email protected]197d20c। मेरी विधि @RequestMapping और मेरी अपनी टिप्पणी के साथ वसंत नियंत्रक है। यह मुझे कुछ स्प्रिंग सिक्योरिटी ऑब्जेक्ट्स क्यों दे रहा है जब इसे HttpServletRequest ऑब्जेक्ट को पैराम्स के रूप में देना चाहिए? – newbie

+0

वे मूल http अनुरोध ऑब्जेक्ट्स के आस-पास वसंत प्रॉक्सी हैं। मेरा अद्यतन उत्तर देखें: आप परिभाषित पैरामीटर प्रकार (स्थिर विश्लेषण) और वास्तविक रनटाइम तर्क (गतिशील विश्लेषण) दोनों –

+0

प्राप्त कर सकते हैं मैं इस मामले में HttpServletRequest ऑब्जेक्ट को स्थिर पैरामीटर मान कैसे प्राप्त कर सकता हूं? – newbie

5

ProceedingJoinPoint जो विधि के सभी मापदंडों रिटर्न pjp.getArgs() है।

(लेकिन इन मानकों/तर्क, गुण नहीं कहा जाता है)