Mam wątek, który ładuje różne klasy dla potrzebnych zasobów w zależności od konkretnej implementacji systemu. Moja implementacja dotyczy Androida i mam klasę, która zwraca specyficzne klasy wymagane przez moją implementację. Wydaje się, że mogę ładować klasę dobrze, ale kiedy próbuję przypisać ją do obiektu w moim głównym wątku, daje mi to wyjątek ClassCastException. Oto fragmenty:Wyjątek ClassCastException podczas dynamicznego ładowania klasy w systemie Android.
W moim głównym wątku, robię:
try {
grammarProcessor = config.loadObject(GrammarProcessor.class);
który daje mi ten StackTrace:
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
jest interfejs i JVoiceXmlGrammarProcessor
jest klasa, że załadunek i implementuje ten interfejs. Kod ładowania jest następująca:
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;
}
}
podczas debugowania, sprawdzić co powrocie z metody ładowania i jest to obiekt z numerem ID. Jeśli go kliknę, wyświetli się [email protected]
, a menu pokaże dwa prywatne pola, które powinien mieć JVoiceXmlGrammarProcessor
, więc wygląda na dobrze załadowany. Jakieś pomysły?
zmienna grammarProcessor należy do klasy GrammarProcessor.class ?? –
Czy próbowałeś użyć 'ClassLoader.getSystemClassLoader()' zamiast wstawiania nowego 'PathClassLoader'? –
@Marakatu Czekaj, jestem zdezorientowany. Co dokładnie próbujesz zrobić? Zwrócić obiekt klasy > według nazwy? Użyj 'Class.forName'. W systemie Android wystarczy użyć nowych programów ładujących klasy, aby załadować klasy z osobnego pliku .dex ([tutaj jest dobry artykuł] (http://android-developers.blogspot.co.uk/2011/07/custom -class-loading-in-dalvik.html)). Proszę wyjaśnij, co próbujesz zrobić. Edycja: Czy ładujesz z tego samego apk lub innego? – Delyan