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();
}
}
Ah, ça explique ça. Merci. –