Wie erhalten Sie Parametertypen durch Reflektion?

8

Ich möchte Funktionen mit unterschiedlichen Parametern verwenden. Das Problem ist, dass ich die Anzahl der Parameter jeder Funktion nicht kenne, und auch ich kenne Namen von Funktion nicht, wie sie in einem Array gespeichert werden. Ich kenne nur den Klassennamen, möchte aber getDeclaredMethods nicht verwenden, da dies die Suchzeit erhöht. Gibt es eine Möglichkeit, die Parametertypen für jede Funktion zu erhalten?

    
Abhinav 11.02.2011, 09:47
quelle

1 Antwort

4

Was ich normalerweise mache, wenn ich Methoden nachschlagen muss, besteht darin, einen Cache-Schlüssel aus der Abfrage, die ich gerade mache, zu generieren und das Suchergebnis mit diesem Cache-Schlüssel in einer Map zu speichern.

Beispiel:

Ich weiß, dass die Methodenparameter Boolean.TRUE , Arrays.asList("foo","bar","baz") und BigInteger.valueOf(77777l)

sind

Meine Klasse enthält eine Methode mit der Signatur

%Vor%

Es gibt keine Möglichkeit, die Parameter den Parametertypen direkt zuzuordnen, weil ich einfach nicht weiß, welche der Superklassen oder Schnittstellen der Parametertyp ist, wie Sie der folgenden Tabelle entnehmen können:

%Vor%

Jedes dieser Paare ist kompatibel, aber es gibt keine Möglichkeit, die kompatible Methode zu finden, ohne eine Vergleichsmethode zu definieren, etwa so:

%Vor%

Also würde ich einen Methodencache haben:

%Vor%

und fügen Sie eine Suchmethode wie folgt hinzu:

%Vor%

Auf diese Weise benötigen nachfolgende Suchvorgänge viel weniger Zeit als die erste (für Parameter des gleichen Typs).

Da Class.getDeclaredMethods() intern einen Cache verwendet, ist natürlich die Frage, ob mein Cache die Performance verbessert. Es ist im Grunde eine Frage dessen, was schneller ist:

  1. Erzeugen eines Cache-Schlüssels und Abfragen einer HashMap oder
  2. über alle Methoden iterieren und nach Parameterkompatibilität suchen

Meine Vermutung: Für große Klassen (viele Methoden) gewinnt die erste Methode, andernfalls die zweite.

    
Sean Patrick Floyd 11.02.2011 10:29
quelle

Tags und Links