2009-04-20 4 views
2

Wenn Sie eine Schnittstelle in Java implementieren, gibt es nichts, was den Aufrufer daran hindern könnte, sich anzusehen, welche konkrete Implementierung Sie geliefert haben, indem Sie diese Klasse umwandeln und Methoden aufrufen, die nicht in der Schnittstelle sind. Ich glaube, das wird "böswilliges Downcasting" genannt.Automatische Generierung von Wrappern, um "bösartigen Downcast" zu verhindern?

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 verfügbar macht. Abgesehen von Überlegungen zu privaten Variablen sollten Sie sicher sein.

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

+1

Danke an Chris Jester-Young für seine Bearbeitung. Jetzt, wo wir Kommentare verbessern können, möchte ich auch Verbesserungen vornehmen ... – Thilo

+0

Danke für dein Kompliment! Sehr geschätzt. –

Antwort

8

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

+0

Ich nehme an, im gleichen Sinne könnte man auch eine paketgeschützte Klasse für die konkrete Implementierung verwenden. – Thilo

+1

Das Problem mit einer paketgeschützten Klasse ist, was verhindert, dass jemand Ihr Paket hinzufügt und dann sieht, was vor sich geht? –

+0

@James: Das würde die Erlaubnis erfordern, einen benutzerdefinierten Classloader zu benutzen, oder? Und wenn Ihr SecurityManager _that_ nicht verbietet, haben Sie bereits verloren. –

7

Ich mag James Blacks Antwort, aber für die Vielfalt werde ich einen alternativen Ansatz posten.

Sie können dazu java.lang.reflect.Proxy verwenden. Siehe this post für einen Code, den ich geschrieben habe (für eine andere Frage), der Proxy verwendet; Sie können ähnlichen Code verwenden, wenn Sie den Synchronisationskram entfernen.

Verwandte Themen