Inselupdate: instanceof mit Class-Objekten, isInstance() und isAssignableFrom
Der binären Operator instanceof testet, ob ein Objekt Exemplar einer Klasse oder der Oberklasse ist. Wenn das Ergebnis wahr ist, lässt sich das Objekt unter dem gegeben Typen ansprechen, ist also zu-weisungskompatibel. Der rechte Operator bei instanceof, der Typname, muss jedoch immer zur Übersetzungszeit bekannt sein und kann nicht dynamisch, etwa durch eine String, festgelegt werden.
Ist der Typname zur Compilerzeit vielleicht unbekannt, kann das Class-Objekt helfen. Die Methode isInstance(Object) ist sozusagen ein dynamisches instanceof. Gilt mit dem Operator
object instanceof ReferenceType
So heißt das mit der Methode
ReferenceType-Class-Objekt.isInstance( object )
Gewöhungsbedürftig ist sicherlich die Tatsache, dass bei der Methode isInstance() die beiden Operanden umgedreht sind. Dazu ein paar Beispiele:
Component b = new JLabel();
out.println( b instanceof JLabel ); // true
out.println( JLabel.class.isInstance( b ) ); // true
out.println( Object.class.isInstance( b ) ); // true
out.println( Class.forName("java.awt.Component").isInstance( b ) ); // true
out.println( String.class.isInstance( b ) ); // false
Die Methode isInstance(object) ist natürlich ein wenig eingeschränkt dadurch, dass es immer ein Test-Objekt geben muss. Die Frage etwa, ob das Class-Objekt der Schnittstelle PublicKey eine ist-eine-Art von Serializable ist, kann isInstance(object) nicht beantworten, denn dann müsste es vorher ein Objekt geben. Für diesen Fall bietet das Class-Objekt noch eine zweite Funktion: isAs-signableFrom(Class).
Class<?> clazz = Serializable.class;
out.println( clazz.isAssignableFrom( String.class ) ); // true
out.println( clazz.isAssignableFrom( Thread.class ) ); // false
out.println( clazz.isAssignableFrom( PublicKey.class ) ); // true
Solange der Typname zur Übersetzungszeit bekannt ist, ist instanceof immer noch die beste Lösung. Doch wenn die Klasse nur durch ein Class-Objekt gegeben ist, bleibt immer noch isAssignableFrom(). Die Methode clazz.isInstance(obj) ist sozusagen eine Kurzform von clazz.isAssignableFrom(obj.getClass()).
Labels: Insel

3 Comments:
Vielen Dank an dieser Stelle für den super blog! Ich schaue hier regelmäßig vorbei und immer gibt es nützliche, interessante Beiträge!
Danke!
By
Anonym, at Juni 24, 2008 7:22 PM
Das sehe ich genauso, habe den RSS abboniert und lese immer gerne die Beiträge. Danke dafür!
By
Anonym, at Juni 24, 2008 9:49 PM
Da schliesse ich mich an.
Der einzigste blog bei dem ich gerne öfter mal zum lesen vorbeischaue. :)
By
Rodriguez, at Juni 25, 2008 8:57 AM
Kommentar veröffentlichen
<< Home