2013-01-21 37 views
15

विधि मैं आह्वान करने के लिए चाहते हैं (मैं जानता हूँ कि यह सार्वजनिक हो लेकिन मैं प्रतिबिंब उपयोग करने की आवश्यकता) के बिना एक विधि लागू:जावा प्रतिबिंब एपीआई: मापदंडों

public byte[] myMethod() 

मैं Method वस्तु इस और m तरह myMethod() शामिल (

byte[] myBytes = null; 
m.invoke(myBytes); 
012: मैं डीबगर के साथ)

Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod"); 

अंत में मैं मीटर आह्वान और एक वस्तु को परिणाम में उत्तीर्ण होना जाँच

m.invoke(myBytes, (Object[])null); 

मैं myBytes को मंगलाचरण का परिणाम कैसे प्राप्त कर सकते हैं:

कोई अपवाद नहीं फेंक दिया जाता है लेकिन myBytes अशक्त रहता है ... मैं भी अधिक सफलता नहीं मिली निम्नलिखित की कोशिश की?

उत्तर

22

कोई अपवाद नहीं फेंक दिया जाता है लेकिन myBytes अशक्त

सही रहता है, क्या आप चाहते थे नहीं था:

byte[] myBytes = (byte[])m.invoke(yourInstance); 

the documentation में अधिक। नोट्स:

  • विधि का वापसी मूल्य invoke का वापसी मूल्य है।
  • invoke का पहला तर्क उदाहरण है जिस पर विधि को कॉल करना है (चूंकि आपने एक आवृत्ति विधि सूचीबद्ध की है, स्थिर स्थिति नहीं है; यदि यह स्थैतिक था, तो पहला तर्क null होगा)। आपने कहीं भी इवेंट का जिक्र नहीं किया है, इसलिए मैंने इसे ऊपर yourInstance कहा है।
9

आप वर्तमान में विधि में myBytesका मूल्य गुजर रहे हैं - जैसे कि यह लक्ष्य वस्तु आप उस पर बुला होगी है। यह वापसी मान है।

आप चाहते हैं:

byte[] myBytes = (byte[]) m.invoke(target); 

जहां target उदाहरण आप उस पर कॉल करने के लिए (के रूप में यह एक उदाहरण विधि है) चाहते हैं।

आप एक उदाहरण नहीं है, तो, विधि, एक स्थिर विधि होना होगा और इस बिंदु पर आप के लिए मंगलाचरण को बदल देंगे:

byte[] myBytes = (byte[]) m.invoke(null); 
0

invoke विधि के लिए उदाहरण वस्तु के रूप में पहला तर्क लेता है पैरामीटर के बाद विधि। यहाँ विधि हस्ताक्षर आह्वान करने के लिए public byte[] myMethod()

कोड है myMethod:

byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance()); 
संबंधित मुद्दे