2012-03-26 10 views
5

लघु संस्करण: मुझे कॉल स्टैक में पिछले Method का पता लगाने के लिए जावा में एक रास्ता खोजने की आवश्यकता है (विधि में पूंजी 'एम' पर ध्यान दें - मुझे वास्तविक java.lang.reflect.Method ऑब्जेक्ट की आवश्यकता है)।जावा में कॉलिंग विधि ढूंढें

पृष्ठभूमि: मैं गूगल अमरूद Preconditions.checkNotNull(...) अवधारणा के लिए एक विस्तार है कि प्रोग्रामर एक साथ अशक्त के लिए मानकों की सभी जांच करने के लिए, और फोन करने के विधि के पैरामीटर के नाम पर आधारित एक एनपीई निर्माण की अनुमति देगा पर काम कर रहा हूँ। उदाहरण के लिए:

public class MyClass 
{ 
    public void myMethod(Object arg1, Integer arg2, String arg3) 
    { 
     MyPreconditions.checkAllNotNull(arg1, arg2, arg3); 
    } 
} 

तो अगर पहले तर्क अशक्त था, तो एनपीई arg1 cannot be null (MyClass:myMethod(Object, Integer, String)

पढ़ सकता है मैं पहले से ही बाहर काम किया है बुला Class पाने के लिए और मैं वसंत के माध्यम से पैरामीटर नाम प्राप्त कर सकते LocalVariableTableParameterNameDiscoverer (या परानामर लाइब्रेरी के माध्यम से) एक में मेरे पास Method है। एकमात्र ऐसा हिस्सा जिसे मैं समझ नहीं पा रहा हूं वह है कि Method स्वयं कैसे प्राप्त करें।

मुझे पता है कि आप नाम विधि प्राप्त करने के लिए स्टैक ट्रेस का उपयोग कर सकते हैं, लेकिन यह विधि मदद नहीं की जाती है, तो यह मदद नहीं करता है। असली स्टैक प्राप्त करने के लिए कोई तरीका है (आंतरिक com.sun कक्षाओं के साथ भी)? वैकल्पिक रूप से, मुझे कॉलिंग विधि के लिए लाइन नंबर मिल सकता है, तो Class ऑब्जेक्ट से पुनर्प्राप्त के रूप में Method की लाइन संख्या खोजने का कोई तरीका है?

+0

http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection –

उत्तर

1

"मुझे पता है कि आप विधि नाम प्राप्त करने के लिए स्टैक ट्रेस का उपयोग कर सकते हैं, लेकिन अगर विधि ओवरराइड हो तो इससे मदद नहीं मिलती है।" - स्टैक ट्रेस में कक्षा का नाम (और स्रोत फ़ाइल) भी शामिल है, हालांकि, इस तरह से सही है कि विधि को ओवरराइड किया गया हो।

मुझे नहीं लगता कि वास्तविक Method ऑब्जेक्ट प्राप्त करने के लिए कोई (अच्छा, सुसंगत) तरीका है। विशेष रूप से ऐसा नहीं है जो एक सक्रिय सुरक्षा प्रबंधक के साथ काम करता है। जावा सुरक्षा कोड स्वयं ऐसा करने के लिए कुछ चाल का उपयोग करता है, लेकिन यह प्रतिलिपि बनाना कि विभिन्न वीएम के बीच पोर्टेबल नहीं होगा।

3

Thread.getStackTrace() आपको वर्तमान स्टैकट्रैक देता है। वहां से आप कक्षा का नाम और विधि का नाम प्राप्त कर सकते हैं (भले ही विधि ओवरराइड हो, आप वहां सटीक कक्षा देखेंगे), और प्रतिबिंब के माध्यम से विधि प्राप्त करें।

लेकिन आईएमओ - यह अजीब है और इसकी आवश्यकता नहीं है। और इसके बारे में बात - आप एक संदेश प्रदान कर रहे हैं जो ज्यादातर पहले से ही स्टैकट्रैक में मौजूद है जो Preconditions कॉल विफल होने पर उत्पन्न होगा।

+0

का डुप्लिकेट आप ' यदि क्लास किसी अन्य क्लासलोडर से आता है तो टी 'विधि' ऑब्जेक्ट को लगातार हल करता है। – Dolda2000

+0

ठीक है आप सीधे 'थ्रोबल' से ट्रेस प्राप्त कर सकते हैं, जैसे कुछ: 'कोशिश करें {नया अपवाद फेंक दें ("जानबूझकर");} पकड़ें (अपवाद ई) {e.getStackTrace(); } '। लेकिन इस बात पर सहमति हुई कि इसकी आवश्यकता कुछ हद तक अजीब है ... – user268396

+0

@ डॉल्डा 2000 जो 'क्लास' ऑब्जेक्ट्स की 'getClassLoader()' विधि है। या तो आपको एक वैध 'क्लासलोडर' उदाहरण मिलता है या आपको 'शून्य' मिलता है जिसका अर्थ है बूट लोडर। तो आप इसे वहां से ले जाते हैं ...? – user268396

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