Moin
Ich will dyn. zur Laufzeit neue Klassen laden können. Die Daten für diese Klassen kommen zur Laufzeit als Byte-array vom Himmel gefallen (über Netzwerk). Ich kann und will sie nicht speichern (damit der normale Classloader sie lädt).
lange Rede kurzer Sinn:
welche Methoden der ClassLoader-klasse muss man in welcher Reihenfolge aufrufen wenn man die Klasse als Byte-array vorliegen hat ?
(Der Name der Klasse ist bekannt)
danke & cu
Hallo,
direkt sehe ich da keine Möglichkeit aber du kannst ja
ClassLoader erweitern und dann das defineClass mit dem
Byte-Array Argument nutzen.
Über welchen Service wird das Byte-Array im Netz ver-
schoben ? Evtl. kannst Du direkt java.net.URLClassLoader
dafür verwenden.
Gruss
Enno
Moin
direkt sehe ich da keine Möglichkeit aber du kannst ja
ClassLoader erweitern und dann das defineClass mit dem
Byte-Array Argument nutzen.
Das geht schon, habs implementiert, verursacht aber ein Problem desen Ursache mir nicht klar ist.
Über welchen Service wird das Byte-Array im Netz ver-
schoben ? Evtl. kannst Du direkt java.net.URLClassLoader
dafür verwenden.
Sie werden über einen ObjectInputStream empfangen. (daran kann ich nichts ändern). Der Server stellt mir alle Klassen zur Verfügung und schickt sie _vor_ dem eingentlichen Object gezipped als byte-array rüber. Ich stoff sie in meinen Classloader, linke, kann sie auch normal benutzen sprich instanzieren, aber die ObjectInputStream findet sie nicht. (class not found)
Der findet sie nur wenn ich sie als .class Datei auf die Platte schreibe. Dann lädt der default Systemclassloader sie von da aus. Das wird aber später nicht mehr gehen da es ein Applet werden soll (Das alle Rechte bzgl. Classloadern hat, aber nicht auf die Platte darf).
In Kurzform:
wie bringt man ObjectInputStream dazu einen anderen Classloader zu benutzen ?
bin ehrlich ratlos.
Danke & cu.
Hallo,
wenn Du den ObjectInputStream austauschen kannst, gibt es
die Möglichkeit die resolveClass davon zu überschreiben.
Dort kann man den ClassLoader austauschen. Die Implementierung
könnte dann in etwa so aussehen:
protected Class resolveClass(ObjectStreamClass v)
throws IOException, ClassNotFoundException
{
ClassLoader loader = myOwnClassLoader();
return Class.forName(v.getName(), false, loader);
}
Ansonsten sehe ich keine Möglichkeit.
Gruss
Enno
Habs raus !
Moin
Dort kann man den ClassLoader austauschen.
Das ist der richtige Ansatz, nur dein Weg ist zu komplex:
http://www-900.ibm.com/developerWorks/cn/education/j…
Man läd einfach eine Klasse (ObjectInputStream…) mit seinem eigenen ClassLoader MC, dadurch wird MC für alle von dieser Klasse geladenen Klassen zum DefaultClassLoader.
Danke für die Hilfe. (Dein Weg müsste auch machbar sein)
cu