जावा में पैकेज नाम सहित वर्तमान वर्ग का नाम कैसे प्राप्त करें?


82

मैं एक परियोजना पर काम कर रहा हूं और एक आवश्यकता यह है कि अगर मुख्य विधि के लिए 2 तर्क " /" (लिनक्स के लिए) से शुरू होता है , तो इसे इसे एक पूर्ण पथ (समस्या नहीं) के रूप में माना जाना चाहिए, लेकिन अगर यह "से शुरू नहीं होता है" /“, इसे कक्षा का वर्तमान कार्य पथ मिलना चाहिए और इसे दिए गए तर्क के साथ जोड़ना चाहिए।

मैं कई मायनों में वर्ग के नाम प्राप्त कर सकते हैं: System.getProperty("java.class.path"), new File(".")और getCanonicalPath(), और इतने पर ...

समस्या यह है, यह केवल मुझे वह निर्देशिका देता है जिसमें पैकेज संग्रहीत किए जाते हैं - यानी अगर मेरे पास " .../project/this/is/package/name" में एक वर्ग संग्रहीत है , तो यह केवल मुझे " /project/" देगा और पैकेज के नाम को अनदेखा करता है जहां वास्तविक .class filesजीवन रहता है।

कोई सुझाव?

संपादित करें: यहाँ विवरण है, व्यायाम विवरण से लिया गया है

sourcedir या तो निरपेक्ष हो सकता है ("/" के साथ शुरू) या जहां से हम कार्यक्रम चलाते हैं उसके सापेक्ष

sourcedir मुख्य विधि के लिए एक दिया गया तर्क है। मुझे वह रास्ता कैसे मिल सकता है?


2
यदि कोड JAR में पैक किया गया है (या अन्यथा फ़ोल्डर / फ़ाइल संरचना में नहीं हैं जैसे आप मान रहे हैं) तो आप क्या करेंगे? यह एक खतरनाक धारणा है; यह एक छोटे से प्रयोग, कक्षा असाइनमेंट या अन्य डिस्पोजेबल स्थिति के लिए ठीक काम कर सकता है, लेकिन कृपया उत्पादन-गुणवत्ता कोड के लिए उस धारणा को बनाने की आदत में न पड़ें।
ई-रिज़

क्लास फाइल का रास्ता खोजने में कोई समझदारी नहीं है। इसके अलावा व्यायाम विवरण में यह उल्लेख नहीं है कि यदि आप इसे ध्यान से पढ़ते हैं ( जहां से हम प्रोग्राम चलाते हैं तो इसका मतलब है कि वर्तमान पथ जहां से प्रोग्राम उपयोगकर्ता द्वारा कहा जाता है)।
द नेल

शायद आप आवश्यकता को बेहतर ढंग से समझने में मेरी मदद कर सकें? मुझे '/' (विवरण में उल्लेख) के साथ शुरू होने वाले तर्क की जांच करने की आवश्यकता है। यदि ऐसा होता है, तो इसे पूर्ण रूप में उपयोग करें। जैसा है। लेकिन अगर यह नहीं है, तो मुझे इसका इलाज कैसे करना चाहिए?
ला ब्ला ब्ला

जवाबों:


166

this.getClass().getCanonicalName()पूर्ण वर्ग नाम प्राप्त करने के लिए उपयोग करें ।

ध्यान दें कि एक पैकेज / वर्ग नाम ("एबीसी") .class फ़ाइलों (/ a / b / C.class) के पथ से अलग है, और पथ को प्राप्त करने के लिए पैकेज नाम / वर्ग नाम का उपयोग करना आमतौर पर बुरा अभ्यास है। वर्ग फ़ाइलों / पैकेजों के समूह कई अलग-अलग वर्ग पथों में हो सकते हैं, जो निर्देशिका या जार फाइलें हो सकते हैं।


धन्यवाद, लेकिन यह मुख्य विधि में है, और स्थैतिक विधियों में 'इस' का उपयोग नहीं किया जा सकता है। इसके आसपास कोई काम?
ला ब्ला ब्ला


30

एक वर्ग है Class, जो ऐसा कर सकता है:

Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass();          // if you want to use the current class

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());

यदि पैकेज में cवर्ग का प्रतिनिधित्व MyClassकिया जाता है mypackage, तो उपरोक्त कोड प्रिंट होगा:

पैकेज: mypackage
वर्ग: MyClass
पूर्ण पहचानकर्ता: mypackage.MyClass

आप इस जानकारी को ले सकते हैं और आपको जो कुछ भी ज़रूरत है उसे संशोधित कर सकते हैं, या अधिक जानकारी के लिए एपीआई की जांच कर सकते हैं।


1
ध्यान दें कि Class.forName ("MyClass") केवल तभी काम करेगा जब वह डिफ़ॉल्ट पैकेज में होगा (अर्थात पैकेज की घोषणा नहीं है)।
नेल

2
@ असली सच है, और getName()संकुल नाम के साथ वर्ग नाम, अब संपादन लौटाता है।
जॉन एग्लैंड

getSimpleName()पैकेज नाम के बिना केवल वर्ग नाम प्राप्त करने के लिए उपयोग करें ।
नेल

1
इसके बजाय Class.forName("MyClass")आपको MyClass.classतब तक उपयोग करना चाहिए जब तक आपको वास्तव में किसी अन्य कारण से रनटाइम खोज की आवश्यकता न हो।
मग्गार्ड

12

पूरी तरह से योग्य नाम निम्नानुसार प्राप्त किया जाता है:

String fqn = YourClass.class.getName();

लेकिन आपको क्लासपैथ संसाधन पढ़ने की आवश्यकता है। इसलिए उपयोग करें

InputStream in = YourClass.getResourceAsStream("resource.txt");

3

का उपयोग this.getClass().getName()पाने के लिए packageName.classNameऔर उपयोग this.getClass().getSimpleName()केवल वर्ग के नाम प्राप्त करने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.