Gibt es eine Möglichkeit, dies zu lösen?
Grundsätzlich nicht.
Soweit es die JLS betrifft, sind die Typen verschiedene Typen, und es gibt keine Möglichkeit, dass die JVM Ihnen erlauben wird, etwas anderes vorzutäuschen. Zum Beispiel könnten die Klassen unterschiedlichen Code und unterschiedliche Objektlayouts haben. Wenn Sie die JVM dazu bringen könnten, die Typen als gleich zu behandeln, könnten Sie die JVM-Laufzeitsicherheit wegblasen. Auf diese Weise liegt Wahnsinn.
Die Lösung besteht darin, sicherzustellen, dass Sie nicht zwei verschiedene Klassenladeprogramme haben, die dieselbe Klasse laden. Im Kontext von Tomcat bedeutet dies, dass, wenn zwei oder mehr Webapps Instanzen einer Klasse teilen müssen, diese Klasse in einem Klassenlader definiert werden muss, der beiden gemeinsam ist; z.B. Setzen Sie die JAR-Datei in das Verzeichnis $CATALINA_HOME/lib
oder $CATALINA_HOME/common
.
Wenn es einen guten Grund, warum die Klassen haben von verschiedenen Classloader geladen werden (vielleicht, weil die Klassen wirklich verschieden sind), dann könnte man das Problem umgehen, indem eine Schnittstelle definiert, die beide Versionen des Klasse implementieren und dann auf die Schnittstelle statt auf die Implementierungsklasse programmieren. Natürlich kann nur eine Version dieses Interfaces geladen werden ... sonst laufen Sie wieder auf dasselbe Problem.
Ich denke, Serialisierung funktioniert möglicherweise, aber ich benutze schließlich CAS, um dieses Problem zu lösen. :) – xiaolg2008