2010-06-03 116 views
3

我在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(); 
    } 
} 

回答

3

我沒有做過任何Android開發,所以我不知道它的類加載器的細微差別,但在一般的Java編程,通過不同的類加載器加載兩個類不相同&hellip;即使它們是從同一個類「文件」加載的。

因此,如果您加載界面X在「你的」類加載器,然後得到一個對象,出現從「洋」的類加載器實現X類,強制轉換爲「你」 X將失敗。

爲了使它工作,X必須從一個類加載器加載,該加載器是其他兩個加載器的公共父類。

+0

啊,這就解釋了。謝謝。 – 2010-06-03 21:31:18