/ / ClassLoader: Zugriffsebene zwischen zwei ClassLoadern und ihren Klassen - Java, Classloader

ClassLoader: Zugriffsebene zwischen zwei ClassLoadern und ihren Klassen - Java, Classloader

folgendes Szenario:

  • CustomClassLoaderA lädt ClassA
  • CustomClassLoaderB lädt ClassB

so weit so gut, aber:

  • CustomClassLoaderA sollte auf ClassB zugreifen können
  • CustomClassLoaderB sollte auf ClassA zugreifen können

Hat jemand eine Idee, wie ich dieses Szenario in Java erreichen kann? Eine weitere Einschränkung besteht darin, dass sich die beiden CustomClassLoader auf derselben Ebene befinden. Sagen wir, sie haben den gleichen ClassLoader.

Vielen Dank im Voraus, Leute!

Antworten:

3 für die Antwort № 1

Ich glaube nicht, dass das möglich ist, seit es normal istDie Klassenladeprogrammimplementierung folgt der übergeordneten Richtlinie, und sie schauen fast nie auf Geschwister zum Laden von Klassen. Ich denke, separate Klassenladeprogramme werden normalerweise verwendet, um die Laufzeit für verschiedene Module / Anwendungen zu trennen, so dass sie nicht in Namespaces kollidieren. Ich würde keine benutzerdefinierten Klassenladeprogramme entwerfen wollen, die diese Grundidee untergraben.

Das heißt, ich denke, es gibt eine brillante Möglichkeit, dies zu erreichen, indem man Schnittstellen und Fabrikmuster verwendet. Sagen wir, ClassA implementiert InterfaceA und es gibt eine Fabrik namens AFactory die Objekte von erzeugt / ausspuckt InterfaceA.

Wir müssen uns um die Klassen kümmern InterfaceA und AFactory werden beide vom übergeordneten Klassenladeprogramm geladen.

Dann CustomClassLoaderA, registriert ein Objekt von ClassA mit dem AFactory (wahrscheinlich beim Start):

AFactory aFactory = AFactory.getInstance():
aFactory.registerA(new ClassA());

Dann der Code, der ausgeführt wird CustomClassLoaderB bekommt eine Instanz von ClassA, nach folgendem Code:

AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();

Ein ähnlicher Code kann für die gemeinsame Nutzung von Objekten geschrieben werden ClassB mit CustomerClassLoaderA.

Beachten Sie, dass Klassen nicht übergreifend geteilt werden könnenInkompatible Klassenlader, aber Objektinstanzen können. Sobald das Objekt erstellt ist, sollte es also kein Problem mehr geben, es um verschiedene Klassenladeprogramme zu werfen, solange es eine gemeinsame Schnittstelle (oder LHS) zum Eingeben gibt.

Sie können auch abstrakte Klassen anstelle von Schnittstellen verwenden.