私は、システムの特定の実装に応じて必要なリソースに対して異なるクラスを読み込むスレッドを持っています。私の実装はAndroid上にあり、実装に必要な特定のクラスを返すクラスがあります。私は、クラスを正常に読み込むことができるようだが、私は私のメインスレッドでオブジェクトに割り当てようとすると、それは私にClassCastExceptionを与える。ここでは、スニペットです:私のメインスレッドで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;
}
}
デバッグ時には、ロードメソッドから戻ってきたものをチェックし、ID番号のオブジェクトです。私がクリックすると[email protected]
と表示され、ドロップダウンにはJVoiceXmlGrammarProcessor
にある2つのプライベートフィールドが表示されるので、読み込まれているようです。何か案は?
grammarProcessor変数の種類はGrammarProcessor.classですか? –
新しいPathClassLoaderをインスタンス化するのではなく、ClassLoader.getSystemClassLoader()を使用しようとしましたか? –
@Marakatu待って、私はスーパー混乱しています。何を正確にしようとしていますか?クラス>オブジェクトを名前で返しますか? 'Class.forName'を使います。 Androidの場合、別の.dexファイルからクラスをロードする場合は、新しいクラスローダーを使用する必要があります([こちらが良い記事](http://android-developers.blogspot.co.uk/2011/07/custom -class-loading-in-dalvik.html))。あなたがしようとしていることを説明してください。編集:あなたは同じapkまたは別のものから読み込んでいますか? – Delyan