Java-Reflection: Überprüfung des Typs des Methodenparameters zur Laufzeit

9

Ich muss prüfen, ob der erste Parameter der Methode List<Class<? extends Exception>> ist oder nicht. Kann jemand bessere Lösung vorschlagen, als mit einem String zu vergleichen?

%Vor%

Ich meine so etwas:

%Vor%

Überprüfen Sie, ob es sich um eine Liste handelt oder nicht. Aber wie kann ich den Class<? extends Exception> -Teil des Typs überprüfen?

    
user1534880 18.07.2012, 13:58
quelle

4 Antworten

5

Habe gerade folgendes versucht und es scheint zu funktionieren:

%Vor%

Bearbeiten: Okay, diesmal für Reals. Ich gerade jetzt bemerkte, dass es List<Class<? extends Exception>> und nicht List<? extends Exception> war. Also sollte diese (hoffentlich) endgültige Lösung tatsächlich zu diesem Fall passen.

    
Random Human 18.07.2012, 14:17
quelle
0

Ich denke, dass Sie nach Type Erasure diese Art von Informationen erhalten können.

Wenn Sie nicht wissen, wie das funktioniert, sehen Sie sich die offizielle Dokumentation an: Java-Typ löschen

Kurz gesagt, wenn der Compiler Ihren Code interpretiert, löscht er alle generischen Informationen und ersetzt sie durch die beschränkten Parameter oder durch Object , wenn sie nicht gebunden sind.

Sie können den Operator instanceof jedoch verwenden, um nach dem Typ Exception zu suchen.

Bearbeiten: Wenn Sie einen Parameter überprüfen möchten, bevor Sie die Methode aufrufen, können Sie das Proxy-Muster verwenden. Details hier: Proxy-Muster

    
Adam Arold 18.07.2012 14:01
quelle
0

Benötigen Sie es speziell List<Class<? extends Exception>> , oder sind Supertypen (wie Collection<Class<? extends Exception>> oder sogar Object ) O.K.? Ich frage, weil Sie isAssignableFrom erwähnen, die nach einer Subtyp-Supertype-Beziehung sucht.

Wenn Sie nach einer Subtyp-Supertype-Beziehung suchen, können Sie etwas tun, was Random Human beschreibt.

Wenn Sie nach einer genauen Übereinstimmung suchen, sollten Sie in der Lage sein, equals zu verwenden: Die verschiedenen Klassen und Interfaces in der Reflection-API spezifizieren freundliche Definitionen von equals . Zum Beispiel ParameterizedType sagt :

  

Instanzen von Klassen, die diese Schnittstelle implementieren, müssen eine equals () -Methode implementieren, die zwei Instanzen mit derselben generischen Typdeklaration und gleichen Typparametern gleichstellt.

Dies erfordert natürlich ein Beispiel für einen List<Class<? extends Exception>> -Parameter, dessen Typ Sie erhalten und den equals Vergleich durchführen können.

(Aber um ehrlich zu sein, die toString Annäherung, während hackish, sieht nicht so schlecht für mich!)

    
ruakh 18.07.2012 14:27
quelle
0

BEARBEITEN:

F: Wie lese ich die obere Schranke aus Parameterargument?

Zum Beispiel verwenden wir die Methodenbeschreibung

public void testMethod(Collection<? extends Exception);

Zuerst müssen wir auf den Parameter des Methodenparameters

zugreifen %Vor%

Von diesem parametrizedType müssen wir es Argument bekommen:

%Vor%

So weit, so gut, jetzt müssen wir überprüfen, dass diese argumentOfargument ein Platzhalter ist.

%Vor%

An dieser Stelle haben wir zwei Optionen für die obere:

%Vor%

oder für niedriger:

%Vor%     
quelle

Tags und Links