2012-12-27 12 views
5

क्या प्रतिबिंब एपीआई का उपयोग कर जावा में किसी विधि को तर्क प्राप्त करना संभव है?जावा - एक विधि में दिए गए तर्क प्राप्त करें?

क्या एएसपी पुस्तकालयों जैसे एस्पेक्टजे का उपयोग करके इसे हासिल करना संभव है?

मैं एंड्रॉइड पर चल रहा हूं।

public abstract class Base { 

    public void printArguments() { 

     //Here I need to get access to arg1, arg2, arg3 
    } 

} 

public class MyClass extends Base { 

    public void (String arg1, Integer arg2, String arg3) { 

     super.printArguments();  
    } 
} 
+0

यू एक भी विधि में पैरामीटर के रूप में आ रहा तर्कों के किसी भी संख्या मुद्रित करने के लिए कोशिश कर रहे हैं? –

+0

हां, मैं अपने आवेदन के लिए कैशिंग परत को डिज़ाइन कर रहा हूं, और मैं कक्षा – aryaxt

उत्तर

3

में यह AspectJ की तरह इस का उपयोग करते हुए AOP पुस्तकालयों को प्राप्त करना संभव है?

हाँ, सुनिश्चित करें।

public class SampleClass { 
    public SampleClass() { super(); } 
    public SampleClass(String s) { this(); } 
    public SampleClass(int i) { this(); } 
    public void method01(String s, Number n, Throwable t) {} 
    public void method02(int i, String s, double d) {} 
    public void method03(String s) {} 
    public void method04() {} 
    public void method05(String s, Number n, double d) {} 

    public static void main(String[] args) { 
     new SampleClass().method01("foo", new Integer(11), new RuntimeException("error")); 
     new SampleClass("test").method02(11, "bar", Math.PI); 
     new SampleClass(123).method03("zot"); 
     new SampleClass("another test").method04(); 
     new SampleClass(456).method05("baz", new Integer(11), Math.E); 
    } 
} 

अब आप सिर्फ एक पहलू है जो अपने सभी विधि फांसी को बीच में रोक लिखने के लिए (और वैकल्पिक भी निर्माता फांसी, जिन्हें आप नीचे) की जरूरत है::

यह AspectJ में ठेठ शुरुआत के व्यायाम की तरह है, इसलिए की तरह है
public aspect MethodArgsAspect { 
    pointcut allMethods()  : execution(* *(..)); 
    pointcut allConstructors() : execution(*.new(..)); 

    before() : !within(MethodArgsAspect) && (allMethods() || allConstructors()) { 
     System.out.println(thisJoinPointStaticPart.getSignature()); 
     for (Object arg : thisJoinPoint.getArgs()) 
      System.out.println(" " + arg); 
    } 
} 

जब SampleClass.main चल रहा है, इस पहलू प्रिंट होगा:

void SampleClass.main(String[]) 
    [Ljava.lang.String;@7fdcde 
SampleClass() 
void SampleClass.method01(String, Number, Throwable) 
    foo 
    11 
    java.lang.RuntimeException: error 
SampleClass() 
SampleClass(String) 
    test 
void SampleClass.method02(int, String, double) 
    11 
    bar 
    3.141592653589793 
SampleClass() 
SampleClass(int) 
    123 
void SampleClass.method03(String) 
    zot 
SampleClass() 
SampleClass(String) 
    another test 
void SampleClass.method04() 
SampleClass() 
SampleClass(int) 
    456 
void SampleClass.method05(String, Number, double) 
    baz 
    11 
    2.718281828459045 
+0

यह कार्यक्रम के सभी तरीकों को रोक देगा। क्या गतिशील रूप से ऐसा करने का कोई तरीका है, जबकि एप्लिकेशन चल रहा है और विधि पैरामीटर मान को पारित करने की आवश्यकता है? – Nitul

+0

मुझे आपके प्रश्न का उत्तर देने में खुशी होगी अगर (ए) आप इसे अपहृत करने के बजाय एक नया बनाते हैं क्योंकि आपसे पूछा गया था कि कुछ अलग है और यहां जवाब दिया गया है और (बी) आप सवाल पूछते हैं कि मैं इसे समझ सकता हूं , चित्रकारी नमूना कोड भी प्रदान करना (निष्पादन योग्य, यदि संभव हो), तो मेरे पास वास्तव में आपके लिए ठीक करने या कार्यान्वित करने के लिए कुछ है। आप यहां एक और टिप्पणी में नए प्रश्न का एक लिंक जोड़ सकते हैं, इसलिए मैं इसे पा सकता हूं। आपका बहुत बहुत धन्यवाद। – kriegaex

1

आप कर सकते थे तो आप इस तर्क

प्राप्त करने के बाद मुझे यकीन है कि अगर यह प्रतिबिंब में किया जा सकता नहीं कर रहा हूँ के लिए जावा चर तर्क

मैं इस विकल्प

किया होता www.java.net/pub/a/today/2004/04/19/varargs.html

जहां आपकी विधि

public void printArguments(Obeject... argArr) { 

    //Here I need to get access to arg1, arg2, arg3 
    //TODO iterate over object array (ie: argArr) and print it. 
    } 

और अपने उप वर्ग

public void someMethodName(String arg1, Integer arg2, String arg3) { 

    super.printArguments(arg1,arg2); 
    super.printArguments(arg1,arg2,arg3);  //the print argument can be called with any number of argument 
} 
+0

के रूप में कक्षा का नाम, विधि नाम, तर्क, और एक एनोटेशन (कैशफ़ोरमिन्यूट) का उपयोग करना चाहता हूं, मुझे यह पसंद नहीं है, मैं सबकुछ बना देता हूं स्वचालित, लेकिन अगर मुझे काम करने के लिए किसी प्रकार की विधि अवरोध नहीं मिल रहा है, तो मैं इसके साथ जा सकता हूं। धन्यवाद – aryaxt

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