2012-03-15 11 views
56

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

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

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

कोई सुझाव?

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

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

sourcedir कार्यक्रम चलाने के लिए रिश्तेदार मुख्य विधि के लिए एक दिया तर्क है। मैं उस पथ को कैसे ढूंढ सकता हूं?

+2

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

+0

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

+0

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

उत्तर

112

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

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

+0

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

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java –

+0

प्रश्न संपादित किया गया। बेहतर वर्णन करने के लिए –

16

एक वर्ग, 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 पैकेज mypackage में वर्ग MyClass का प्रतिनिधित्व किया, इसके बाद के संस्करण कोड प्रिंट होगा:

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

आप यह जानकारी ले सकते हैं और जो भी आपको चाहिए, उसे संशोधित कर सकते हैं, या अधिक जानकारी के लिए check the API पर जाएं।

+0

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

+1

@TheNail सच है, और 'getName() 'अब क्लास नाम के साथ पैकेज नाम देता है, संपादन कर रहा है। – Jon

+0

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

6

पूरी तरह से योग्य नाम निम्नलिखित हैं opbtained है:

String fqn = YourClass.class.getName(); 

लेकिन अगर आप एक classpath संसाधन पढ़ने की जरूरत है। तो

InputStream in = YourClass.getResourceAsStream("resource.txt"); 
संबंधित मुद्दे