में गतिशील रूप से एक वर्ग लोड करते समय मेरे पास एक थ्रेड है जो सिस्टम के विशिष्ट कार्यान्वयन के आधार पर आवश्यक संसाधनों के लिए विभिन्न वर्गों को लोड करता है। मेरा कार्यान्वयन एंड्रॉइड पर है और मेरे पास एक कक्षा है जो मेरे कार्यान्वयन द्वारा आवश्यक विशिष्ट वर्गों को लौटाती है। मैं कक्षा को ठीक से लोड करने में सक्षम हूं, लेकिन जब मैं इसे अपने मुख्य धागे में ऑब्जेक्ट को असाइन करने का प्रयास करता हूं, तो यह मुझे क्लासकास्ट अपवाद देता है। यहाँ के टुकड़े कर रहे हैं:क्लासकास्ट अपवाद जबकि एंड्रॉइड
मेरी मुख्य थ्रेड में, मैं कार्य करें:
try {
grammarProcessor = config.loadObject(GrammarProcessor.class);
जो मुझे इस स्टैकट्रेस देता है:
E/AndroidRuntime(6682): FATAL EXCEPTION: JVoiceXmlMain
E/AndroidRuntime(6682): java.lang.ClassCastException: org.jvoicexml.android.JVoiceXmlGrammarProcessor
E/AndroidRuntime(6682): at org.jvoicexml.JVoiceXmlMain.run(JVoiceXmlMain.java:321)
GrammarProcessor
एक अंतरफलक और JVoiceXmlGrammarProcessor
है वर्ग है कि मैं लोड है और इंटरफ़ेस लागू करता है। लोड हो रहा है कोड इस प्रकार है:
else if(baseClass == GrammarProcessor.class){
String packageName = "org.jvoicexml.android";
String className = "org.jvoicexml.android.JVoiceXmlGrammarProcessor";
String apkName = null;
Class<?> handler = null;
T b = null;
try {
PackageManager manager = callManagerContext.getPackageManager();
ApplicationInfo info= manager.getApplicationInfo(packageName, 0);
apkName= info.sourceDir;
} catch (NameNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
}
PathClassLoader myClassLoader =
new dalvik.system.PathClassLoader(
apkName,
ClassLoader.getSystemClassLoader());
try {
handler = Class.forName(className, true, myClassLoader);
return (T) handler.newInstance();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
जब डीबगिंग, मैं जाँच क्या लोड विधि से लौट रहे है और यह एक आईडी नंबर के साथ एक वस्तु है। यदि मैं उस पर क्लिक करता हूं, तो यह [email protected]
कहेंगे, और ड्रॉपडाउन दो निजी फ़ील्ड दिखाएगा जो JVoiceXmlGrammarProcessor
होना चाहिए, इसलिए ऐसा लगता है कि यह अच्छी तरह से लोड हो गया है। कोई विचार?
व्याकरणप्रोसेसर परिवर्तक कक्षा व्याकरणप्रोसेसर.क्लास का है ?? –
क्या आपने नए 'PathClassLoader' को तुरंत चालू करने के बजाय 'ClassLoader.getSystemClassLoader()' का उपयोग करने का प्रयास किया था? –
@ माराकातु रुको, मैं बहुत उलझन में हूं। आप वास्तव में क्या करने की कोशिश कर रहे हैं? नाम से कक्षा > ऑब्जेक्ट वापस करें? 'Class.forName' का प्रयोग करें। एंड्रॉइड पर, यदि आप अलग-अलग .dex फ़ाइल से कक्षाएं लोड करना चाहते हैं तो आपको केवल नए क्लासलोडर का उपयोग करने की आवश्यकता है ([यहां एक अच्छा लेख] (http://android-developers.blogspot.co.uk/2011/07/custom श्रेणी लोडिंग-इन-dalvik.html))। कृपया बताएं कि आप क्या करने की कोशिश कर रहे हैं। संपादित करें: क्या आप एक ही एपीके या एक अलग से लोड हो रहे हैं? – Delyan