2 Stimmen

Automatische Erzeugung von Wrappern zur Verhinderung von "böswilligem Downcast"?

Wenn Sie eine Schnittstelle in Java implementieren, hindert nichts den Aufrufer daran, die von Ihnen bereitgestellte konkrete Implementierung zu prüfen, auf diese Klasse zu casten und Methoden aufzurufen, die nicht in der Schnittstelle enthalten sind. Ich glaube, das nennt man "böswilliges Downcasting".

Eine Möglichkeit, dies zu verhindern, besteht darin, einen Wrapper zu erstellen, der nur über die Methoden der Schnittstelle verfügt und die Implementierungsinstanz, an die er delegiert, nicht offenlegt. Abgesehen von der Reflexion auf private Variablen sollten Sie sicher sein.

Gibt es eine Möglichkeit, diese Art von Wrappern automatisch zu erstellen (zur Laufzeit, nicht mit einem Code-Erstellungs-Assistenten in der IDE, denn das erzeugt immer noch eine Quelldatei, die gepflegt werden muss)?

8voto

James Black Punkte 41034

Eine andere Möglichkeit, sich dagegen zu schützen, ist die Verwendung einer Fabrikklasse, wobei die Implementierung eine private innere Klasse der Fabrik sein muss. Nur die Fabrik kann sie sehen und sie gibt nur den Schnittstellentyp zurück, so dass es keine konkrete Implementierung gibt, gegen die gecastet werden muss.

7voto

Chris Jester-Young Punkte 212385

Mir gefällt die Antwort von James Black, aber zur Abwechslung werde ich einen alternativen Ansatz vorschlagen.

Sie können verwenden java.lang.reflect.Proxy um dies zu tun. Siehe diese Stelle für einen Code, den ich (für eine andere Frage) geschrieben habe und der Proxy Sie können einen ähnlichen Code verwenden, wenn Sie den Synchronisationskram weglassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X