Tengo un hilo que carga diferentes clases para los recursos que necesita dependiendo de la implementación específica del sistema. Mi implementación está en Android y tengo una clase que devuelve las clases específicas que necesita mi implementación. Parece que puedo cargar bien la clase, pero cuando trato de asignarlo al objeto en mi hilo principal, me da una ClassCastException. Aquí están los fragmentos:ClassCastException al cargar dinámicamente una clase en Android
En mi hilo principal, que hago:
try {
grammarProcessor = config.loadObject(GrammarProcessor.class);
que me da este 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
es una interfaz y JVoiceXmlGrammarProcessor
es la clase que se carga e implementa esa interfaz. El código de carga es la siguiente:
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;
}
}
Cuando la depuración, puedo comprobar lo que está de regresar del método de carga y es un objeto con un número de identificación. Si hago clic en él, dirá [email protected]
, y el menú desplegable mostrará los dos campos privados que debería tener un JVoiceXmlGrammarProcessor
, por lo que parece que está bien cargado. ¿Algunas ideas?
grammarProcessor variable es de la clase GrammarProcessor.class ?? –
¿Ha intentado utilizar 'ClassLoader.getSystemClassLoader()' en lugar de crear un nuevo 'PathClassLoader'? –
@Marakatu Espera, estoy súper confundido. ¿Qué estás tratando de hacer exactamente? ¿Devuelve un objeto de clase > por su nombre? Use 'Class.forName'. En Android, solo necesita utilizar nuevos cargadores de clases si desea cargar clases desde un archivo .dex separado ([aquí hay un buen artículo]) (http://android-developers.blogspot.co.uk/2011/07/custom -class-loading-in-dalvik.html)). Por favor explique lo que está tratando de hacer. Editar: ¿Estás cargando desde la misma aplicación o una diferente? – Delyan