2010-11-30 12 views
9

की एक तर्क को ओवरराइट करें, मैं एक ऐसा पहलू विकसित कर रहा हूं जो सेटटर विधियों के तर्कों की जांच करता है और शून्य मान के साथ खाली तारों को ओवरराइट करता है। यह मेरा राज्य अब तक है:Aspectj विधि

@Before("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void check(final JoinPoint jp) { 
    LOGGER.debug(jp.getSignature().toLongString()); 
    Object[] args = jp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
}

दुर्भाग्य से अधिलेखित बयान args[i] = null; अब काम करता है! क्या किसी को पता है कि मुझे इसे कैसे ओवरराइट करना चाहिए?

चीयर्स,

केविन

+0

@ केविन बीटीडब्ल्यू आप इस 'अगर (तर्क [i] उदाहरण स्ट्रिंग एंड ((स्ट्रिंग) तर्क [i]) को प्रतिस्थापित कर सकते हैं। IsEmpty()) '' के साथ' अगर ("" बराबर है (args [i])) ' –

+0

धन्यवाद, क्या यह और तेज़ है? कास्टिंग के कारण मई? – eglobetrotter

+0

मुझे नहीं लगता कि प्रदर्शन के मामले में बहुत अंतर है, लेकिन मेरा संस्करण अधिक पठनीय है और इसलिए कम त्रुटि-प्रवण –

उत्तर

-3

@Ralph आप बिल्कुल सही है, अंतर यह है कि एक के आसपास सलाह के साथ मैं निष्पादन करने के लिए आर्ग पारित करने में सक्षम हूँ! यह ठीक काम करता है!

@Around("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void checkAroundSetter(final ProceedingJoinPoint pjp) 
    throws Throwable { 
    LOGGER.debug(pjp.getSignature().toLongString()); 
    Object[] args = pjp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
    pjp.proceed(args); 
} 

अरे लोग आप प्रदर्शन के बारे में क्या सोचते हैं?

+4

यह कोई जवाब नहीं है। यदि आप राल्फ के जवाब का जवाब देना चाहते हैं, तो एक टिप्पणी पोस्ट करें, अगर आप अतिरिक्त जानकारी जोड़ना चाहते हैं, तो अपना प्रश्न संपादित करें। आपको यह जवाब हटाना चाहिए। –

+0

लेकिन मेरे पास एक और सवाल है, जो मेरे विषय से संबंधित है। – eglobetrotter

+0

फिर एक नया प्रश्न पोस्ट करें। SO प्रश्न एक समय में –

28

मेरा मानना ​​है कि आप सलाह से पहले एक के आसपास सलाह लागू करने के लिए, एक के बजाय है।

क्योंकि आप अपने नए तर्क के साथ आगे बढ़ना उपयोग कर सकते हैं:

proceed(newArgs); 
+0

धन्यवाद, मुझे पहले की बजाय आसपास की सलाह क्यों लागू करनी है? अंतर कहां से है कि एक आसपास की सलाह के साथ मैं एक विधि के निष्पादन को नियंत्रित करने में सक्षम हूं, अपवाद पकड़ता हूं और वापसी मूल्य की जांच करता हूं? – eglobetrotter

+7

सलाह से पहले तर्क सरणी की एक प्रति प्राप्त होती है, लेकिन यह मूल तर्कों को संशोधित नहीं कर सकती है। यही एक सलाह है जिसके लिए एक सलाह है। राल्फ: +1 –

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