2016-05-13 3 views
0

Ich habe ein Problem mit dem Laden eines Objekts, das von zwei verschiedenen Klassenladern instanziiert wird. Grundsätzlich implementiere ich eine Webapp mit drei verschiedenen Plugins, jedes mit einem eigenen Classloader. Die Projektstruktur sieht so aus:Wie man dieselbe Klasse mit zwei verschiedenen Klassenladern lädt

MyAppService 
- ObjectInterface.java 
MyAppImpl 
- ObjectImplementation.java 
MyClass 
- MyClass.java 

Es ist ein mavenbasiertes Projekt. MyAppImpl und MyClass beide haben MyAppService als Abhängigkeit. Jetzt verwende ich diesen Code, um ein Objekt der Klasse ObjectImplementation in Klasse ObjectImplementation zu erstellen.

ObjectInterface o = new ObjectImplementation(); 

Ich möchte in der Klasse dieses Objekt an eine Methode zu übergeben Myclass, wo ich das Objekt mit diesem Code.

ObjectInterface o = (ObjectInterface) passedObject; 

Aber ich bekomme die Ausnahme java.lang.ClassCastException: MyAppImpl.ObjectImplementation cannot be cast to MyAppService.ObjectInterface. Ich habe auch versucht, dynamischen Laden von Klassen mit dem Code

ObjectInterface o = (ObjectInterface) Class.forName("MyAppImpl.ObjectImplementation").newInstance(); 

aber ich bekomme die Ausnahme java.lang.ClassNotFoundException: MyAppImpl.ObjectImplementation. Das Hinzufügen von MyAppImpl als Abhängigkeit für MyClass ist derzeit keine Option. Weiß jemand, ob es eine Lösung für mein Problem gibt?

Antwort

0

Bitte lesen Sie über ClassLoaders und seine Hierarchie. Lesen Sie auch über Delegierungsmechanismus.

In Ihrem Fall werden Klassen von Leaf-Klassenladern geladen und es gibt verschiedene Kopien derselben Klasse. Wenn die bestimmte Klasse nicht vom aktuellen Klassenladeprogramm oder einem der übergeordneten Klassen geladen wird, erhalten Sie die java.lang.ClassCastException.

Verwandte Themen