स्ट्रिंग से क्लास का प्रकार प्राप्त करना


87

मेरे पास एक Stringवर्ग का नाम है "Ex"(कोई .classविस्तार नहीं )। मैं इसे एक Classवैरिएबल को सौंपना चाहता हूं , जैसे:

Class cls = (string).class

मैं उसे कैसे कर सकता हूँ?


क्या होगा अगर क्लास अलग प्रोजेक्ट में है?
स्टीवन

1
आपकी टिप्पणी के लिए: क्या! ??? यदि आपकी कक्षा एक अलग परियोजना में थी, तो क्या यह आपके आईडीई पर निर्भर नहीं करेगा? जहां तक ​​आपके आवेदन का संबंध है, यह वैसे ही होगा जैसे कि यह उसी परियोजना में वैसे भी था क्योंकि यह पुस्तकालयों को बाह्य रूप से संदर्भित किया जाता है। जैसे, आप जानते हैं कि जावा एपीआई कक्षाएं आपके प्रोजेक्ट में नहीं हैं, है ना? लेकिन, आपके आईडीई के लिए कंपाइलर जानता है कि उन्हें कहां ढूंढना है, अगर आपका आईडीई सही तरीके से सेट है। यही बात किसी अन्य परियोजना से आपकी कक्षाओं पर भी लागू होती है।
user919860

जवाबों:


168
Class<?> cls = Class.forName(className);

लेकिन आपका classNameपूरी तरह से योग्य होना चाहिए - यानीcom.mycompany.MyClass


2
इसका फेंक ClassNotFound अपवाद
स्टीवन

1
तब या तो क्लास क्लासपाथ पर नहीं है या आप पूरी तरह से योग्य क्लास नाम नहीं पास कर रहे हैं जैसे com.mycompany.project.ClassName
हंस वेस्टरबेक

आप किस मूल्य से classNameगुजर रहे हैं? क्या आपके वर्गपथ पर ऐसा कोई वर्ग है?
बूझो

हाँ कक्षा एक ही पैकेज में है
स्टीवन

1
मुझे भी यही समस्या हुई ClassNotFoundException। ट्राइ-कैच में अपवाद को संभालना था। कुछ इस तरह:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama

43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

अधिक जानकारी के लिए http://java.sun.com/docs/books/tutorial/reflect/TOC.html पर प्रतिबिंब पर जावा ट्यूटोरियल ट्रेल की जाँच करें ।


3
Bozho के उत्तर में अधिक अंक हो सकते हैं, लेकिन मुझे लगता है कि आपका विवरण अधिक वर्णनात्मक है। पुनश्च। आपका नाम जुआनज़े क्यों है ??? लगभग स्पेनिश और चीनी के बीच मिश्रण की तरह लगता है। : डी। क्या इसके पीछे कोई चतुर अर्थ है?
user919860

मैं ग्रहण में एक गतिशील वेब परियोजना के साथ काम कर रहा हूँ। मैं एक कक्षा लाने के लिए उपरोक्त कोड का उपयोग कर रहा हूं। लेकिन यह ClassNotFoundException को लौटाता है, जब मैं इस तरह एक स्ट्रिंग चर का उपयोग करता हूं: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); यदि पैरामीटर के रूप में पूरी तरह से योग्य वर्ग नाम हार्डकोड है तो चीजें ठीक काम करती हैं। कोई उपाय?
दिब्यांशु जायसवाल

8

आप की forNameविधि का उपयोग कर सकते हैं Class:

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();

मैं ग्रहण में एक गतिशील वेब परियोजना के साथ काम कर रहा हूं। मैं एक कक्षा लाने के लिए उपरोक्त कोड का उपयोग कर रहा हूं। लेकिन यह ClassNotFoundException को लौटाता है, जब मैं इस तरह एक स्ट्रिंग चर का उपयोग करता हूं: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); यदि पैरामीटर के रूप में पूरी तरह से योग्य वर्ग नाम हार्डकोड है तो चीजें ठीक काम करती हैं। कोई उपाय?
दिब्यांशु जायसवाल

@djthequest यदि हमारे clsNameवैरिएबल में पूरी तरह से योग्य क्लासनाम है तो इसका उपयोग करने और हार्डकोड स्ट्रिंग के बीच कोई अंतर नहीं होना चाहिए। हो सकता है कि आपको क्लास की क्लास की जरूरत न हो। यह आपके स्टार्टअप कोड में एक ही जार से एक सामान्य वर्ग को तुरंत लिखने में मदद कर सकता है ताकि यह सुनिश्चित किया जा सके कि पुस्तकालय लोडर में मौजूद है।
आरएसपी

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन चर के बजाय अगर मैं स्ट्रिंग को हार्डकोड करता हूं, फिन काम करता है, तो इसका मतलब है कि कक्षाएं वर्ग पथ में हैं, है ना? बाद में मुझे पता चला, Class.forName()विधि एक finalचर की उम्मीद करती है। एक साधारण चर काम नहीं करेगा।
दिब्यांशु जायसवाल

4

जावा रिफ्लेक्शन कॉन्सेप्ट के जरिए रन टाइम के दौरान आप किसी भी क्लास का क्लास रेफरेंस पा सकते हैं।

नीचे दिए गए कोड की जाँच करें। स्पष्टीकरण नीचे दिया गया है

यहां एक उदाहरण दिया गया है जो AClass का उदाहरण बनाने के लिए लौटा हुआ वर्ग उपयोग करता है:

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

मुद्रित उत्पादन है

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

वर्ग पहले ही लोड हो चुका है इसलिए एसीलैस में कोई दूसरा "स्टैटिक ब्लॉक" नहीं है

स्पष्टीकरण नीचे है

Class.ForName को क्लास ऑब्जेक्ट प्राप्त करने के लिए कहा जाता है

क्लास ऑब्जेक्ट का उपयोग करके हम क्लास का नया उदाहरण बना रहे हैं।

इस बारे में कोई संदेह मुझे पता है


क्या होगा अगर क्लास अलग प्रोजेक्ट में है?
स्टीवन

1
क्या आप उस गद्य की जार फ़ाइल प्राप्त कर सकते हैं और कक्षा का नाम किसी चीज़ को निर्दिष्ट कर सकते हैं जैसे Class.forName ("oracle.jdbc.driver.OracleDriver")
gmhk


2

यकीन नहीं है कि आप क्या पूछ रहे हैं, लेकिन ... Class.forname , शायद?


इसका फेंक ClassNotFound अपवाद
स्टीवन

क्या होगा अगर क्लास अलग प्रोजेक्ट में है?
स्टीवन

1
मैं देख रहा हूं कि कोई भी आपके सवाल का जवाब नहीं दे रहा है। इससे कोई फर्क नहीं पड़ता कि यह किसी अन्य परियोजना में है जब तक कि कंपाइलर जानता है कि कहां देखना है। चूंकि, आप शायद एक आईडीई का उपयोग कर रहे हैं, यह संभवतः केवल आईडीई पर निर्भर करता है। संदर्भों के बारे में बात, आप जानते हैं कि जावा पुस्तकालयों से आपके द्वारा संदर्भित सभी वर्ग आपकी परियोजना में नहीं हैं, है ना? लेकिन, कंपाइलर जानता है कि उन्हें कहां देखना है क्योंकि यह जानता है कि वे बाहरी रूप से संदर्भित हैं। ऐसा लगता है कि जब आप उन्नत जावा प्रोग्रामिंग करने का प्रयास कर रहे हैं, तो आपको बुनियादी जावा प्रोग्रामिंग सीखने की आवश्यकता है। : |
user919860
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.