lancé à travers chargeur de classe?
Comment puis-je faire cela:
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 dont j'ai besoin est pour la JVM de considérer les Foo instance de cl comme si elle est une instance de Foo à partir du chargeur de classe de l'exécution du code.
J'ai vu ces approches, aucun d'entre eux bon pour moi (l'exemple ci-dessus est un jouet exemple):
- Charge de la classe (ou une autre interface) par un chargeur de classe parent à la fois le code d'appel et créé chargeur de classe
- Sérialiser et désérialiser l'objet.
Vous devez vous connecter pour publier un commentaire.
Pas possible. Identité de classe comprend le nom complet et le chargeur de classes.
Coulage d'un objet à une classe du même nom chargé par les différents chargeurs de classes n'est pas différent que d'essayer de jeter un
String
àInteger
, parce que ces classes pourraient être vraiment complètement différent malgré le fait d'avoir le même nom.Object obj = cl.loadClass("Foo").newInstance();
, alors comment pouvons-nous appeler les méthodes de la nouvelle instance de Foo?Je viens de passer les deux derniers jours aux prises avec ce problème et j'ai enfin eu le problème à l'aide de java réflexion:
Espère que cela aide quelqu'un.
Si la classe qui ont besoin d'être exprimées implémente Serializable alors:
utilisation:
Peut-être quelque chose à l'aide d'interfaces et de
java.lang.reflect.Proxy
serait fonction de vos préférences. À l'aide d'unInvocationHandler
qui trouve et invoque la méthode de la classe cible. (Remarque, tout mobile-code de sécurité que vous avez sera tourné à travers si vous faites cela.)Pas possible de jeter dans différents classLoader.
Vous avez cette solution de contournement avec Gson, exemple convertir l'Objet de YourObject (Object est un YourObject classe, mais dans d'autres classLoader):
- Je utiliser cette solution de contournement parce que j'ai compiler n'importe quel code java dans une Application web (Tomcat). Cette solution de contournement exécuter dans la production.
C'est un vieux post où je suis arrivé parce que je voulais faire presque la même chose, mais une version plus simple de lui...
Il fonctionne réellement si les deux Foo et les chargés de classe (dans mon cas, à partir d'un .java classfile dans un autre package) étendre la même classe, dire, AbstractTestClass.
Morceaux de code:
De cette façon, je peux insérer la classe chargée dans un
ArrayList<AbstractTestClass>
.