我在Android中嘗試了一些東西,並且在試圖將另一個.apk中的類投射到我的接口時遇到困難。我有其他.apks中的接口和各種類實現該接口。我發現其他類使用PackageManager的查詢方法,並使用Application#createPackageContext()獲取該上下文的類加載器。然後我加載這個類,創建一個新的實例並嘗試將其轉換到我的界面,我知道它確實實現了。當通過反射創建接口時將對象投射到對象
當我嘗試投射時,它會拋出類拋出異常。我嘗試了各種各樣的東西,比如先使用Class#asSubclass等加載接口,但其中沒有一個能夠工作。類#getInterfaces()顯示接口已實現。我的代碼如下:
PackageManager pm = getPackageManager();
List<ResolveInfo> lr = pm.queryIntentServices(new Intent("com.example.some.action"), 0);
ArrayList<MyInterface> list = new ArrayList<MyInterface>();
for (ResolveInfo r : lr) {
try {
Context c = getApplication().createPackageContext(r.serviceInfo.packageName, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
ClassLoader cl = c.getClassLoader();
String className = r.serviceInfo.name;
if (className != null) {
try {
Class<?> cls = cl.loadClass(className);
Object o = cls.newInstance();
if (o instanceof MyInterface) { //fails
list.add((MyInterface) o);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // some exceptions removed for readability
}
} catch (NameNotFoundException e1) {
e1.printStackTrace();
}
}
啊,這就解釋了。謝謝。 – 2010-06-03 21:31:18