इसके नाम से क्लास हो रही है


81

अगर मेरे पास अपने आवेदन में TestActivity नामक एक गतिविधि वर्ग है, तो क्या इस तरह से इसके नाम से इसकी कक्षा प्राप्त करने का एक तरीका है:

Class<?> c = getClassByName("TestActivity");

जवाबों:


162

का उपयोग forName बजाय ..

कुछ इस तरह..

 try {
    Class<?> act = Class.forName("com.bla.TestActivity");
 } catch (ClassNotFoundException e) {
        e.printStackTrace();
}

30
आपको पूरा पैकेज नाम भी देना होगा। जैसे: com.bla.TestActivity तर्क के रूप में Class.forName
रिची

1
क्या आप भी प्राप्त करने के लिए कुछ कर सकते हैं Class<? extends SomeClass>?
गोबलींस

@Gobliins नहीं - संकलक इस बात की गारंटी नहीं दे सकता है कि आप किस तरह की क्लास लेने जा रहे हैं, इसलिए यह आपको क्लास <?> देता है। यदि आप जानते हैं कि आपको किस तरह की क्लास मिलने वाली है, तो आपको इसे कास्ट करना होगा (अभी भी, आपको अनियंत्रित कास्ट चेतावनियाँ मिलेंगी क्योंकि कास्ट सुरक्षित नहीं है)।
दयलांतेपिगुय जुले

1
@Gobliins एक निश्चित प्रकार का उपवर्ग प्राप्त करने के बारे में मेरा उत्तर देखें ।
रफनेस

7

आप Class::forNameअज्ञात प्रकार की एक क्लास ऑब्जेक्ट प्राप्त करने के लिए उपयोग कर सकते हैं । यदि आप एक टाइप की हुई कक्षा प्राप्त करना चाहते हैं, तो आप निम्न Class::asSubclassवर्ग द्वारा उपयोग कर सकते हैं Class::forName:

Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
                                               .asSubclass(Activity.class);

बेशक आपको विभिन्न प्रकार के अपवादों का एक गुच्छा भी संभालना होगा। जैसा कि प्रतिबिंब के साथ व्यवहार करते समय सामान्य होता है।


6

Class.forName उस पर अपवाद है लगता है। यह इस मुद्दे को संबोधित करने के लिए उपरोक्त पर विस्तार करने के लिए है।

try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}

इस तरह से उत्तर देने का सामान्य तरीका उनके उत्तर को संपादित करना होगा । हालाँकि, अपवाद जावा में बहुतायत से हैं (और आपका कोड इसे अनदेखा करता है), एक टिप्पणी इसे संबोधित करने के लिए पर्याप्त होगी।
tsn

7
@ क्रेजीहाथफ़िश - ऐसा लगता है जैसे पैट्रिक को अपने स्वयं के उत्तर को छोड़कर कुछ भी उपयोगी करने के लिए नहीं मिला होगा।
amess

4
@amess व्हाट्स, आपका अधिकार, मैं भूल गया कि टिप्पणियों को प्रतिनिधि की आवश्यकता है। मुझे सही करने के लिए धन्यवाद।
tsn

2

मुझे भी इसी तरह की आवश्यकता थी, मेरे पास बैकेंड से आने वाला एक जसन था जिसमें स्क्रीन और एक्टिविटी मैपिंग थी। चूंकि आईओएस / एंड्रॉइड दोनों के लिए समान रूप से json, हम Activityjson जैसे शब्दों को जोड़ नहीं सकते , इसलिए हमने यही किया

  1. सभी के लिए json में Activityया Viewcontrollersके लिए सरल नाम का उपयोग करें HomeActivityऔर HomeViewControllerहम "होम" का उपयोग करेंगे

  2. एप्लिकेशन में, हम जोंस को पार्स करते हैं और मैंने गतिविधि को गतिशील रूप से प्राप्त करने के लिए नीचे उपयोगिता विधियां लिखी हैं

वर्ग का नाम प्राप्त करने के लिए (अर्थात यदि हम घर से गुजरते हैं, तो हम वापस आ जाएंगे com.package.HomeActivity)

    fun getClassInfoFor(name: String, context: Context):String{
        var str = "${context.getPackageName()}.${name}Activity"
        return str
    }

अब स्ट्रिंग से क्लास लेना है

        try {
            val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
            val fetchedClass = Class.forName(className)
            val showDetailsIntent = Intent(context, fetchedClass)
            context.startActivity(showDetailsIntent)
        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        }

इस तरह मैं आसानी से एक ही विधि के साथ कई वर्गों का प्रबंधन कर सकता हूं। मैं इसे एक पुनर्नवीनीकरण दृश्य में उपयोग करता हूं जहां मेरा हर सेल एक अलग गतिविधि के लिए नेविगेट करता है।


कृपया ध्यान दें कि आपका जवाब कोटलिन में है;) संभवतः इसे जावा बनाने के लिए इसे थोड़ा बदल दें।
LMD

@ एलएमडी शायद एंड्रॉइड डेवलपर्स में से अधिकांश को एक जवाब की तलाश में है कोटलिन संस्करण की आवश्यकता है, जावा नहीं;)
रुस्लान बिर्ज़ोव

@RuslanBerozov ऑप ने सवाल को [जावा] के रूप में टैग किया है, इसलिए मैं कम से कम एक जावा संस्करण (अतिरिक्त कोटलिन ठीक भी है) की उम्मीद करूंगा।
LMD

@LMD क्षमा करें, लेकिन 2012 में एक सवाल पोस्ट किया गया। यह कल्पना करना वास्तव में मुश्किल है कि वह उस समय कोटलिन के बारे में जानता था। मुद्दा यह है कि प्रश्न को [एंड्रॉइड] के रूप में भी चिह्नित किया गया है, और आजकल मुझे कोटलिन संस्करण पसंद है।
रुसलान बिरज़ोव

-2

यह आपके प्रश्न के लिए सबसे अधिक प्रासंगिक उत्तर नहीं हो सकता है, लेकिन आम तौर पर स्ट्रिंग के रूप में हार्डकोड क्लास नाम के शाब्दिक रूप से खराब है। इसका इस्तेमाल करना बेहतर हो सकता है

Class<?> act = TestActivity.class;

वाक्य - विन्यास।

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