У меня есть поток, который загружает разные классы для необходимых ему ресурсов в зависимости от конкретной реализации системы. Моя реализация находится на Android, и у меня есть класс, который возвращает определенные классы, необходимые для моей реализации. Кажется, я могу нормально загрузить класс, но когда я пытаюсь назначить его объекту в моем основном потоке, он дает мне исключение ClassCastException. Вот фрагменты:
В моем основном потоке я делаю:
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;
}
}
При отладке я проверяю, что возвращает метод загрузки, и это объект с идентификационным номером. Если я нажму на него, он скажет org.jvoicexml.android.JVoiceXmlGrammarProcessor@40565820
, и в раскрывающемся списке будут показаны два частных поля, которые должен иметь JVoiceXmlGrammarProcessor
, так что это выглядит вроде хорошо загружен. Есть идеи?