Comment puis-je faire ceci:cast à travers classloader?
class Foo {
public static Foo get() throws Exception {
ClassLoader cl = new URLClassLoader(new URL[]{"foo.jar"}, null); // Foo.class is in foo.jar
return (Foo)cl.loadClass("Foo").newInstance(); // fails on class cast
}
}
Ce que j'ai besoin est pour la machine virtuelle Java pour examiner l'instance Foo de cl comme si elle est une instance de Foo du classloader du code d'exécution.
J'ai vu ces approches, aucun d'entre eux bon pour moi (l'exemple ci-dessus est un exemple de jouet):
- charge la classe (ou une interface distincte) par un chargeur de classe qui est un parent de à la fois le code appelant et le chargeur de classe créé
- Sérialiser et désérialiser l'objet.
Donc, si nous ne pouvons même pas jeter ces nouveaux cas, comment pouvons-nous les utiliser? Si tout ce que nous pouvons faire est 'Object obj = cl.loadClass (" Foo "). NewInstance();', alors comment appelons-nous les méthodes de la nouvelle instance de Foo? – Pacerier
@Pacerier: Eh bien, vous pourriez utiliser la réflexion. Mais un cas plus pratique consiste à faire en sorte que les classes étendent des classes ou implémentent des interfaces à partir d'un chargeur de classe parent dans la hiérarchie de délégation qui sont également disponibles pour le reste du code. Mais dans l'exemple de code, il n'y a pas de chargeur de classe parent (le second paramètre du constructeur est nul) ... –
La performance de la seconde option sera-t-elle plus rapide que l'utilisation de la réflexion? Ou est-ce vrai qu'il utilise la réflexion de toute façon? – Pacerier