अगर मेरे पास अपने आवेदन में TestActivity नामक एक गतिविधि वर्ग है, तो क्या इस तरह से इसके नाम से इसकी कक्षा प्राप्त करने का एक तरीका है:
Class<?> c = getClassByName("TestActivity");
जवाबों:
का उपयोग forName बजाय ..
कुछ इस तरह..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
?
आप Class::forName
अज्ञात प्रकार की एक क्लास ऑब्जेक्ट प्राप्त करने के लिए उपयोग कर सकते हैं । यदि आप एक टाइप की हुई कक्षा प्राप्त करना चाहते हैं, तो आप निम्न Class::asSubclass
वर्ग द्वारा उपयोग कर सकते हैं Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
बेशक आपको विभिन्न प्रकार के अपवादों का एक गुच्छा भी संभालना होगा। जैसा कि प्रतिबिंब के साथ व्यवहार करते समय सामान्य होता है।
Class.forName उस पर अपवाद है लगता है। यह इस मुद्दे को संबोधित करने के लिए उपरोक्त पर विस्तार करने के लिए है।
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
मुझे भी इसी तरह की आवश्यकता थी, मेरे पास बैकेंड से आने वाला एक जसन था जिसमें स्क्रीन और एक्टिविटी मैपिंग थी। चूंकि आईओएस / एंड्रॉइड दोनों के लिए समान रूप से json, हम Activity
json जैसे शब्दों को जोड़ नहीं सकते , इसलिए हमने यही किया
सभी के लिए json में Activity
या Viewcontrollers
के लिए सरल नाम का उपयोग करें HomeActivity
और HomeViewController
हम "होम" का उपयोग करेंगे
एप्लिकेशन में, हम जोंस को पार्स करते हैं और मैंने गतिविधि को गतिशील रूप से प्राप्त करने के लिए नीचे उपयोगिता विधियां लिखी हैं
वर्ग का नाम प्राप्त करने के लिए (अर्थात यदि हम घर से गुजरते हैं, तो हम वापस आ जाएंगे 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()
}
इस तरह मैं आसानी से एक ही विधि के साथ कई वर्गों का प्रबंधन कर सकता हूं। मैं इसे एक पुनर्नवीनीकरण दृश्य में उपयोग करता हूं जहां मेरा हर सेल एक अलग गतिविधि के लिए नेविगेट करता है।