Stimmen über classloader?
Wie kann ich dies tun:
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
}
}
Was ich brauchen, ist für die JVM zu betrachten, die Foo-Instanz, die aus cl, als ob es eine Instanz von Foo aus der classloader, der die Ausführung von code.
Habe ich gesehen, diese Ansätze, keiner von Ihnen gut für mich (das obige Beispiel ist ein Spielzeug, Beispiel):
- Laden der Klasse (oder eine separate Schnittstelle) von einem class loader ist, dass ein Elternteil sowohl der aufrufende code und erstellt classloader
- Serialisieren und Deserialisieren das Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht möglich. Klasse Identität, besteht aus den voll qualifizierten Namen und dem ClassLoader.
Casting eines Objekts zu einer Klasse mit dem gleichen Namen geladen von verschiedenen classloadern ist es nicht anders, als zu versuchen, warf einen
String
zuInteger
, weil diese Klassen kann wirklich ganz unterschiedlich trotz des gleichen namens.Object obj = cl.loadClass("Foo").newInstance();
, wie können wir dann die Methoden aufrufen, die der neuen Instanz von Foo?Ich verbrachte die letzten zwei Tage kämpft mit genau diesem Problem und ich habe endlich um das problem durch die Verwendung von java-reflection:
Hoffe, das jemand hilft.
Wenn die Klasse, die müssen umgewandelt werden, implementiert Serializable dann:
Verwendung:
Vielleicht etwas mit Schnittstellen und
java.lang.reflect.Proxy
würde Ihrer Bedürfnisse anpassen. Mit einemInvocationHandler
findet und ruft die relevante Methode der Zielklasse. (Beachten Sie, dass alle mobile-code-Sicherheit, die Sie haben, erschossen werden durch, wenn Sie dies tun.)Nicht möglich zu werfen in verschiedenen classLoader.
Haben Sie diese Abhilfe mit Gson, Beispiel cast-Objekt YourObject (Objekt ist eine YourObject Klasse, aber in anderen classLoader):
Ich diese Problemumgehung verwenden, weil ich kompilieren aller java-code in einer WebApp (Tomcat). Diese Problemumgehung in der Produktion.
Dies ist eine alte post, wo ich angekommen, denn ich wollte fast das gleiche, aber eine einfachere version davon...
Es tatsächlich funktioniert, wenn beide Foo und der geladenen Klasse (in meinem Fall aus .java-classfile in einem anderen Paket) erweitern die gleiche Klasse, sagen, AbstractTestClass.
Stück code:
Diese Weise kann ich das einfügen der geladenen Klasse in einem
ArrayList<AbstractTestClass>
.