簡體   English   中英

通過反射創建對象時將對象轉換為接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM