2010-06-03 9 views
3

J'essaie certaines choses sur Android et je suis bloqué quand j'essaie de lancer une classe dans un autre .apk à mon interface. J'ai l'interface et diverses classes dans d'autres .apks qui implémentent cette interface. Je trouve les autres classes en utilisant les méthodes de requête de PackageManager et utilise Application # createPackageContext() pour obtenir le classloader pour ce contexte. Je charge ensuite la classe, crée une nouvelle instance et essaye de la transtyper sur mon interface, que je sais qu'elle implémente définitivement. Lorsque j'essaye de lancer, il lance une exception de distribution de classe. J'ai essayé plusieurs choses comme le chargement de l'interface en premier, en utilisant la classe # asSubclass, etc, qui ne fonctionne pas. La classe # getInterfaces() montre que l'interface est implémentée. Mon code est ci-dessous:Diffuser l'objet à l'interface lors de la création par réflexion

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

Répondre

3

Je ne l'ai pas fait de développement Android, donc je ne suis pas sûr des nuances de ses chargeurs de classes, mais dans la programmation générale de Java, deux classes chargées par des chargeurs de classe ne sont pas le même & hellip; même s'ils sont chargés depuis la même classe "fichier".

Donc, si vous chargez l'interface X dans « votre » chargeur de classe, puis obtenez un objet qui apparaît pour mettre en œuvre la classe X d'un chargeur de classe « étrangère », un casting à « votre » X échouera.

Pour que cela fonctionne, X doit être chargé à partir d'un chargeur de classe qui est un parent commun aux deux autres chargeurs.

+0

Ah, ça explique ça. Merci. –

Questions connexes