Announcement

Collapse
No announcement yet.

Non caching classloader

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Non caching classloader

    Ich brauche einen Classloader, der eine Klasse auf jeden Fall neu von Platte lädt, auch wenn die Klasse zuvor bereits geladen war. Ist sowas überhaupt möglich ? Was passiert mit existierenden Instanzen der "alten" Klasse (wenn sich z.B. das Classfile geändert hat)?

  • #2
    Mit derselben ClassLoader-Instanz ist es nicht möglich. Selbst wenn man das Caching umgeht, spätestens beim zweiten Aufruf von defineClass kracht es (duplicate class definition). Der Trick ist, eine neue ClassLoader-Instanz zu erzeugen und damit die Klasse neu zu laden, so machen es auch hotdeploy-fähige Server. Wenn man dann die Klassen irgendwohin packt, wo nur der eigene ClassLoader sie sieht (also nicht der System-Klassenpfad), dann ist auch der Cache egal, denn es wird sowieso eine neue Instanz des ClassLoader erzeugt und dessen Cache ist leer. Trotzdem kann man natürlich einen Classloader schreiben, der immer zuerst versucht, die Klasse selbst zu laden anstatt vorschriftsgemäß an den parent zu delegieren. Das hat den Vorteil, daß auch Klassen im System-Klassenpfad neu geladen werden können (ist aber generell etwas gefährlich). Alte Referenzen bleiben "intakt", sind aber nicht zuweisungskompatibel zu den neu geladenen Klassen, selbst wenn sie vom selben Typ sind. Das ganze sauber zu implementieren, inklusive der Entsorgung der alten ClassLoader mit allen Referenzen ist sehr trickreich. Hilfreich könnte z.b. das hier sein:

    http://www.myarch.com/reloader/

    Dort ist im wesentlichen schon alles implementiert, was so ein ClassLoader braucht. Zu dem Thema gibt es auch unzählige Artikel im Internet.

    Gruß,

    Alwi

    Comment

    Working...
    X