ClassCastException при динамической загрузке класса в Android

У меня есть поток, который загружает разные классы для необходимых ему ресурсов в зависимости от конкретной реализации системы. Моя реализация находится на 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, так что это выглядит вроде хорошо загружен. Есть идеи?

8
задан hopper 2 August 2013 в 18:55
поделиться