2012-12-20 12 views
9

क्या जावा में एक विधि है कि यह जांचने के लिए कि कोई स्ट्रिंग क्लास नाम के रूप में उपयोग की जा सकती है या नहीं?कक्षा का नाम वैध है या नहीं, यह कैसे जांचें?

+0

[नियमित अभिव्यक्ति पूरी तरह से योग्य जावा वर्गों मिलान] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5205339:

कोई . रों अनुमति दी जानी चाहिए, तो जांच इस तरह से किया जा सकता है/नियमित-अभिव्यक्ति-मिलान-पूरी तरह से योग्य-जावा-कक्षाएं) –

+1

वह पूछ रहा है कि नाम कानूनी नाम होगा, भले ही कक्षा वास्तव में मौजूद न हो। (मुझे लगता है) – dashrb

+0

हाँ मैं प्रतिबिंब और नाम के साथ एक नई कक्षा बनाना चाहता हूं ... इसलिए मुझे यह जांचना है कि नाम मान्य है – Maxii

उत्तर

0

याप -

Class.forName(String className); 

यह वर्ग या दिए गए स्ट्रिंग नाम के साथ इंटरफेस के साथ जुड़े कक्षा वस्तु देता है। और Exceptions

LinkageError - if the linkage fails 
ExceptionInInitializerError - if the initialization provoked by this method fails 
ClassNotFoundException - if the class cannot be located 
+1

यह जांचता है कि वर्ग मौजूद है या नहीं, यह नहीं कि स्ट्रिंग क्लास नाम के रूप में उपयोग के लिए कानूनी है या नहीं (ओपी क्या जानना चाहता है)। –

+0

@ टेड मैंने सिर्फ जानकारी दी है और मुझे लगता है कि मिस्टर द्वारा सुझाए गए कार्यों को बनाने के लिए पर्याप्त जानकारी होगी। –

+0

मुझे असहमत होना चाहिए। ओपी जानना चाहता है कि क्या नाम कक्षा के नाम के रूप में मान्य होगा, न कि कक्षा मौजूद है या नहीं। आपके सुझाव के साथ समस्या यह है कि यह कानूनी नामों के लिए 'foo.bar" '(यदि वर्ग मौजूद नहीं है) और गैरकानूनी नामों के लिए' "! =?" 'के समान 'क्लास नॉटफाउंड अपवाद' को फेंक देगा। –

6

फेंकता केवल, Class.forName(String name) विधि, जो इस प्रकार यह परीक्षण करने के लिए इस्तेमाल किया जा सकता के साथ:

public static boolean classExists(String className) 
{ 
    try 
    { 
     Class.forName(className); 
     return true; 
    } 
    catch(ClassNotFoundException ex) 
    { 
     return false; 
    } 
} 

संपादित करें: हैं, के रूप में dashrb ने कहा, यदि आप एक के लिए पूछ रहे हैं यह निर्धारित करने का तरीका है कि एक स्ट्रिंग का उपयोग कक्षा के नाम के रूप में किया जा सकता है (यदि उस नाम से पहले से ही एक कक्षा है), तो आपको जो विधि चाहिए वह ऊपर दी गई विधि का संयोजन है (बूलियन फ़्लिप किए गए हैं, जैसा कि आप कर सकते हैं ' टी नामों का पुन: उपयोग करें), और यह जांचने के लिए एक जांच के साथ कि स्ट्रिंग जावा-आरक्षित कीवर्ड है या नहीं। मुझे हाल ही में एक ही समस्या थी और इसके लिए एक यूटिलिटी क्लास बनाया जिसे आप here पा सकते हैं। मैं इसे आपके लिए नहीं लिखूंगा, लेकिन आपको मूल रूप से !JavaKeywords.isKeyword(className) के लिए चेक में जोड़ने की आवश्यकता है।

संपादित करें 2:

return Character.isUpperCase(className.charAt(0)); 

संपादित 3: और निश्चित रूप से, अगर आप भी आम तौर पर स्वीकार कोडिंग मानकों लागू करना चाहते हैं, तो आप सिर्फ यह सुनिश्चित करें कि वर्ग के नाम के साथ बड़े अक्षर से शुरू होता है बना सकता है: जैसा कि टेड होप बताते हैं, यहां तक ​​कि एक जावा कीवर्ड भी एक वर्ग का नाम अमान्य करता है, और जावाकेडवर्ड्स का उपयोग मेरे उत्पादन अनुप्रयोगों में से एक में किया जाता है, इसलिए मैंने updated version बनाया है जिसमें विधि containsKeyword(String toCheck) है जो इस घटना की जांच भी करेगा। विधि (कृपया ध्यान दें कि आप भी कक्षा में कीवर्ड की सूची की जरूरत है) इस प्रकार है:

public static boolean containsKeyword(String toCheck) 
{ 
    toCheck = toCheck.toLowerCase(); 
    for(String keyword : keywords) 
    { 
     if(toCheck.equals(keyword) || toCheck.endsWith("." + keyword) || 
      toCheck.startsWith(keyword + ".") || toCheck.contains("." + keyword + ".")) 
     { 
      return true; 
     }//End if 
    }//End for 
    return false; 
}//End containsKeyword() 
+0

आपकी संपादन पोस्ट वह उत्तर है जो मुझे चाहिए। धन्यवाद! – Maxii

+0

आपको पूंजी होने के लिए पहले पत्र की आवश्यकता नहीं है। – tcb

+0

@ टीसीबी मुझे पता है, लेकिन कक्षाओं के साथ कक्षाएं शुरू करने के लिए यह काफी मानक अभ्यास है, जिसे मैं निश्चित रूप से सुनिश्चित करता हूं कि अंतर्निहित पैकेज में प्रत्येक गैर-आदिम वर्ग है। – MrLore

5

मैं जावा कीवर्ड की सूची कृपया MrLore द्वारा की पेशकश का इस्तेमाल किया।

private static final Set<String> javaKeywords = new HashSet<String>(Arrays.asList(
    "abstract",  "assert",  "boolean",  "break",   "byte", 
    "case",   "catch",   "char",   "class",   "const", 
    "continue",  "default",  "do",   "double",   "else", 
    "enum",   "extends",  "false",  "final",   "finally", 
    "float",  "for",   "goto",   "if",    "implements", 
    "import",  "instanceof", "int",   "interface",  "long", 
    "native",  "new",   "null",   "package",   "private", 
    "protected", "public",  "return",  "short",   "static", 
    "strictfp",  "super",   "switch",  "synchronized", "this", 
    "throw",  "throws",  "transient", "true",   "try", 
    "void",   "volatile",  "while" 
)); 

private static final Pattern JAVA_CLASS_NAME_PART_PATTERN = 
    Pattern.compile("[A-Za-z_$]+[a-zA-Z0-9_$]*"); 

public static boolean isJavaClassName(String text) { 
    for (String part : text.split("\\.")) { 
     if (javaKeywords.contains(part) || 
       !JAVA_CLASS_NAME_PART_PATTERN.matcher(part).matches()) { 
      return false; 
     }   
    } 
    return text.length() > 0; 
} 
+1

यह 'com.example.true' जैसे नामों के साथ ठीक से सौदा नहीं करेगा (जो एक अवैध नाम है क्योंकि नाम का एक _component_ एक कीवर्ड है)। ध्यान दें कि परीक्षण को "com.example जैसे नामों को भी अनुमति देने की आवश्यकता है .true_fact "' –

+0

@ टेड हॉप निश्चित। धन्यवाद। – tcb

+1

बिल्कुल तय नहीं है। यह अभी भी "com.example.true" जैसे नामों की अनुमति देगा। –

14

SourceVersion.isName का उपयोग पूरी तरह से योग्य नामों की जांच के लिए किया जा सकता है।

boolean isValidName (String className) { 
    return SourceVersion.isIdentifier(className) && !SourceVersion.isKeyword(className); 
} 
+0

आप तीन साल देर हो चुकी हैं पार्टी, लेकिन यह ठीक तरह से जाने का रास्ता है। – mwoodman

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