Wenn ich eine Klasse wie diese habe:
public class Whatever
{
public void aMethod(int aParam);
}
Gibt es eine Möglichkeit zu wissen, dass aMethod
ein Parameter namens verwendet aParam
wird, der vom Typ ist int
?
java
reflection
Geo
quelle
quelle
Antworten:
Zusammenfassen:
method.getParameterTypes()
Um die Autovervollständigungsfunktion für einen Editor zu schreiben (wie Sie in einem der Kommentare angegeben haben), gibt es einige Optionen:
arg0
,arg1
,arg2
usw.intParam
,stringParam
,objectTypeParam
etc.quelle
In Java 8 können Sie Folgendes tun:
Für Ihre Klasse können
Whatever
wir also einen manuellen Test durchführen:Dies sollte gedruckt werden,
[aParam]
wenn Sie ein-parameters
Argument an Ihren Java 8-Compiler übergeben haben.Für Maven-Benutzer:
Weitere Informationen finden Sie unter folgenden Links:
quelle
Die Paranamer-Bibliothek wurde erstellt, um dasselbe Problem zu lösen.
Es wird versucht, Methodennamen auf verschiedene Arten zu ermitteln. Wenn die Klasse mit Debugging kompiliert wurde, kann sie die Informationen durch Lesen des Bytecodes der Klasse extrahieren.
Eine andere Möglichkeit besteht darin, ein privates statisches Element in den Bytecode der Klasse einzufügen, nachdem es kompiliert wurde, aber bevor es in ein Glas gestellt wird. Anschließend werden diese Informationen mithilfe von Reflection zur Laufzeit aus der Klasse extrahiert.
https://github.com/paul-hammant/paranamer
Ich hatte Probleme mit dieser Bibliothek, aber am Ende habe ich sie zum Laufen gebracht. Ich hoffe, die Probleme dem Betreuer melden zu können.
quelle
ParameterNAmesNotFoundException
Siehe org.springframework.core.DefaultParameterNameDiscoverer-Klasse
quelle
Ja.
Der Code muss mit einem Java 8-kompatiblen Compiler kompiliert werden, mit der Option zum Speichern der aktivierten formalen Parameternamen ( Option -parameters ).
Dann sollte dieses Code-Snippet funktionieren:
quelle
Sie können die Methode mit Reflektion abrufen und ihre Argumenttypen erkennen. Überprüfen Sie http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Sie können jedoch den Namen des verwendeten Arguments nicht angeben.
quelle
Es ist möglich und Spring MVC 3 macht es, aber ich habe mir nicht die Zeit genommen, genau zu sehen, wie.
Entnommen aus der Federdokumentation
quelle
Während es nicht möglich ist (wie andere gezeigt haben), Sie könnten eine Anmerkung verwenden , um die Parameter - Namen zu übertragen, und dass , obwohl Reflexion erhalten.
Nicht die sauberste Lösung, aber sie erledigt den Job. Einige Webservices tun dies tatsächlich, um Parameternamen beizubehalten (dh: Bereitstellen von WSs mit Glassfish).
quelle
Siehe java.beans.ConstructorProperties , eine Anmerkung, die genau dafür entwickelt wurde.
quelle
Sie sollten also in der Lage sein:
Aber Sie werden wahrscheinlich eine Liste wie diese erhalten:
Ich glaube, dass dies in Groovy 2.5+ behoben wird
Derzeit lautet die Antwort also:
Siehe auch:
Für jede Methode dann so etwas wie:
quelle
aMethod
. Ich möchte es für alle Methoden in einer Klasse bekommen.antlr
, um Parameternamen dafür zu erhalten?Wenn Sie die Eclipse verwenden, sehen Sie sich das folgende Bild an, damit der Compiler die Informationen zu Methodenparametern speichern kann
quelle
Wie @Bozho sagte, ist dies möglich, wenn Debug-Informationen während der Kompilierung enthalten sind. Hier gibt es eine gute Antwort ...
Wie erhalte ich die Parameternamen der Konstruktoren eines Objekts (Reflektion)? von @AdamPaynter
... mit der ASM-Bibliothek. Ich habe ein Beispiel zusammengestellt, das zeigt, wie Sie Ihr Ziel erreichen können.
Beginnen Sie zunächst mit einer pom.xml mit diesen Abhängigkeiten.
Dann sollte diese Klasse tun, was Sie wollen. Rufen Sie einfach die statische Methode auf
getParameterNames()
.Hier ist ein Beispiel mit einem Unit-Test.
Das vollständige Beispiel finden Sie auf GitHub
Vorsichtsmaßnahmen
static
Methoden. Dies liegt daran, dass in diesem Fall die Anzahl der von ASM zurückgegebenen Argumente unterschiedlich ist, dies jedoch leicht behoben werden kann.quelle
Parameternamen sind nur für den Compiler nützlich. Wenn der Compiler eine Klassendatei generiert, werden die Parameternamen nicht berücksichtigt. Die Argumentliste einer Methode besteht nur aus der Anzahl und den Typen ihrer Argumente. Es ist also unmöglich, den Parameternamen mithilfe von Reflection (wie in Ihrer Frage markiert) abzurufen - er existiert nirgendwo.
Wenn die Verwendung von Reflektion jedoch keine schwierige Anforderung ist, können Sie diese Informationen direkt aus dem Quellcode abrufen (vorausgesetzt, Sie haben sie).
quelle
Parameter names are only useful to the compiler.
Falsch. Schauen Sie sich die Nachrüstbibliothek an. Es verwendet dynamische Schnittstellen, um REST-API-Anforderungen zu erstellen. Eine seiner Funktionen ist die Möglichkeit, Platzhalternamen in den URL-Pfaden zu definieren und diese Platzhalter durch die entsprechenden Parameternamen zu ersetzen.Um meine 2 Cent hinzuzufügen; Parameterinformationen sind in einer Klassendatei "zum Debuggen" verfügbar, wenn Sie javac -g zum Kompilieren der Quelle verwenden. Und es steht APT zur Verfügung, aber Sie benötigen eine Anmerkung, die für Sie keinen Nutzen hat. (Jemand hat vor 4-5 Jahren hier etwas Ähnliches besprochen: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Kurz gesagt, Sie können es nur erhalten, wenn Sie direkt an Quelldateien arbeiten (ähnlich wie bei APT zur Kompilierungszeit).
quelle