[英]Is it possible to cast a retrieved Class object (via reflection) to an interface?
[英]Cast object to interface when created via reflection
我在Android中嘗試了一些東西,當我試圖將另一個.apk中的類強制轉換到我的界面時,我會陷入困境。 我有其他.apks中的接口和各種類來實現該接口。 我使用PackageManager的查詢方法找到其他類,並使用Application#createPackageContext()來獲取該上下文的類加載器。 然后我加載類,創建一個新實例並嘗試將其轉換為我的界面,我知道它肯定會實現。
當我嘗試強制轉換時,它會拋出一個類強制轉換異常。 我嘗試了各種各樣的東西,比如首先加載接口,使用Class#asSubclass等,但都沒有。 Class#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();
}
}
我沒有做任何Android開發,所以我不確定它的類加載器的細微差別,但在一般的Java編程中,由不同的類加載器加載的兩個類是不一樣的......即使它們是從同一個類加載的“文件”。
因此,如果您在“您的”類加載器中加載接口X
,然后從“外部”類加載器獲取似乎實現類X
的對象,則對“您的” X
將失敗。
為了使它工作, X
必須從類加載器加載,該加載器是其他兩個加載器的公共父級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.