2012-04-06 15 views
2

Ich schreibe ein Programm in Java und ich habe eine Methode mit einem Header wie public void doSomething(Object o) und ich möchte überprüfen, ob o der geeignete Typ für einen Parameter einer anderen Methode ist. Also was ich habe ist:Wie bekomme ich den Typ eines Objekts, damit ich es mit instanceof verwenden kann?

public void doSomething(Object o) 
{ 
    Method m = //get method of another method (using reflection) 
    Class<?> cl = m.getParameterTypes()[0]; //Get the class of the 0th parameter 
    if(o instanceof cl)   //compile error here 
     //do something 
} 

Allerdings funktioniert das nicht. Kann mir bitte jemand helfen. Dank

+0

was Instanz von dem, was damit die Bedingung erfüllt werden soll? – amit

+0

Entschuldigung, mein Fehler ... Das sollte "o instanceof cl" sein – Nosrettap

+1

Würde 'cl.isAssignableFrom (o.getClass)' funktionieren? – rsp

Antwort

4

instanceof Nimmt einen statischen Typ als Parameter, was Sie suchen, ist eine dynamische Überprüfung, ob o als Parameter für die Methode arbeiten wird;

Object o = ... 
Method m = ... 
Class cl = m.getParameterTypes()[0]; 
if(cl.isAssignableFrom(o.getClass())) // Is an 'o' assignable to a 'cl'? 
{ 
} 
+0

Was ist der Unterschied zwischen einem statischen Typ und dem, was Sie hier haben? – Nosrettap

+0

@Nosrettap Sie versuchen zu sehen, ob 'o' eine Instanz eines' cl' ist, jedoch weiß der Compiler zum Zeitpunkt der Kompilierung nicht den Typ von 'cl'. Wenn Sie zum Zeitpunkt der Kompilierung den Typ cl kennen, können Sie das Schlüsselwort instanceof verwenden. –

+0

Vielen Dank Joachim Isaksson !!! – Nosrettap

1

Sie können stattdessen

if (o.getClass().equals(cl)) 

tun. Ich glaube, instanceof erfordert den tatsächlichen Typ (wie String und nicht String.class).

+0

Gibt es keine Möglichkeit, den Typ zu bekommen, wenn ich die Klasse habe? – Nosrettap

+0

Oder gibt es eine Methode namens getGenericParameterTypes(), die einen 'Type' zurückgibt, aber auch dies funktioniert nicht – Nosrettap

+0

Das ist nicht wirklich was ich mit" Typ "meine. Ich glaube, die 'instanceof'-Prüfung geschieht zur Kompilierzeit und nicht zur Laufzeit. Sie können diese Überprüfung also nicht programmgesteuert durchführen. Aber die Lösung, die ich oben gepostet habe, sollte ziemlich genau dasselbe tun. –

4

diesen Versuchen Sie stattdessen:

if(c1.isInstance(o)) 
{ 
    // ... 
} 
Verwandte Themen