Kann ich den Methodenparameternamen mithilfe der Java-Reflektion erhalten?
Wenn ich eine Klasse wie folgt aus:
public class Whatever
{
public void aMethod(int aParam);
}
gibt es eine Möglichkeit zu wissen, dass aMethod
verwendet einen parameter namens aParam
das ist der Typ int
?
InformationsquelleAutor der Frage Geo | 2010-02-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusammenfassen:
method.getParameterTypes()
Für schreiben AutoVervollständigen-Funktionalität für einen editor (wie gesagt in einem der Kommentare) gibt es ein paar Optionen:
arg0
arg1
arg2
etc.intParam
stringParam
objectTypeParam
usw.InformationsquelleAutor der Antwort Bozho
In Java 8 können Sie Folgendes tun:
Also für Ihre Klasse
Whatever
können wir tun, ein manueller test:dem drucken sollten
[aParam]
wenn Sie bestanden haben-parameters
argument, um Ihre Java-8-compiler.Für Maven Nutzer:
Weitere Informationen finden Sie unter folgenden links:
InformationsquelleAutor der Antwort lpandzic
Den Paranamer Bibliothek wurde geschaffen, um zu lösen dieses problem.
Es wird versucht zu bestimmen, Methode Namen in ein paar verschiedene Möglichkeiten. Wenn die Klasse kompiliert wurde debugging kann das extrahieren der Informationen durch das Lesen der bytecode der Klasse.
Anderen Weg ist es zu injizieren einer privaten statischen member in den bytecode der Klasse, nachdem es kompiliert wurde, aber bevor es in ein Glas. Es verwendet dann die Reflexion, diese Informationen zu extrahieren, die von der Klasse zur Laufzeit.
https://github.com/paul-hammant/paranamer
Hatte ich Probleme, die diese Bibliothek nutzen, aber ich habe es in der Ende. Ich bin der Hoffnung, um die Probleme zu melden, um die Betreuer.
InformationsquelleAutor der Antwort Sarel Botha
Ja.
Code kompiliert werden muss mit Java 8 kompatibel compiler mit der option zum speichern von formalen Parameternamen eingeschaltet (-Parameter option).
Dann dieser code sollte funktionieren:
InformationsquelleAutor der Antwort Karol Król
Können Sie abrufen, die Methode mit der Reflexion und erkennen, es ist argument-Typen. Überprüfen Sie http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Jedoch, Sie können nicht sagen, der name des Arguments verwendet.
InformationsquelleAutor der Antwort Johnco
siehe org.springframework.core.DefaultParameterNameDiscoverer Klasse
InformationsquelleAutor der Antwort Denis Danilkovich
Es möglich ist, und Spring MVC 3 funktioniert es, aber ich habe nicht die Zeit nehmen, um zu sehen, wie genau.
Stammt aus der spring-Dokumentation
InformationsquelleAutor der Antwort flybywire
Zwar ist es nicht möglich (wie bereits dargestellt), Sie könnte Verwendung einer annotation zu führen über die parameter name, und erhalten, dass, obwohl die Reflexion.
Nicht die sauberste Lösung, aber es bekommt den job getan. Einige webservices, tatsächlich tun dies, um die Namen der parameter (sprich: der Bereitstellung von WSs mit glassfish).
InformationsquelleAutor der Antwort WhyNotHugo
Sehen java.Bohnen.ConstructorPropertieses ist eine Anmerkung, konzipiert für genau diese.
InformationsquelleAutor der Antwort Markus Jevring
So dass Sie sollten in der Lage sein zu tun:
Aber Sie werden wahrscheinlich erhalten eine Liste, etwa so:
Ich glaube, das wird behoben, in Groovy 2.5+
Also aktuell die Antwort ist:
Siehe auch:
Für jede Methode, dann so etwas wie:
InformationsquelleAutor der Antwort tim_yates
wenn Sie mithilfe des eclipse finden Sie unter dem unten Bild, damit der compiler speichern die Informationen über die Parameter der Methode
InformationsquelleAutor der Antwort Hazim
Werden die Namen der Parameter sind nur nützlich, um den compiler. Wenn der compiler erzeugt eine class-Datei, die Namen der parameter sind nicht im Lieferumfang enthalten - eine Methode, die Argumentliste nur aus der Anzahl und den Typen Ihrer Argumente. So würde es unmöglich sein, die zum abrufen der parameter name mit Reflexion (als tagged in deiner Frage) - es existiert nicht überall.
Jedoch, wenn die Verwendung der Reflexion ist nicht eine harte Anforderung, können Sie diese Informationen abrufen direkt aus dem source-code (sofern Sie es haben).
InformationsquelleAutor der Antwort danben
Hinzufügen meine 2 Cent; parameter info ist erhältlich in einer Klasse-Datei "Debuggen", wenn Sie javac -g kompiliert die Quelle. Und es ist für APT, sondern Sie brauchen eine Anmerkung, damit keine Verwendung für Sie. (Jemand diskutiert etwas ähnliches vor 4 bis 5 Jahren hier: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Insgesamt-kurz-Sie können es nicht erhalten, es sei denn, Sie arbeiten mit Quellcode-Dateien direkt (ähnlich wie APT funktioniert zur compile-Zeit).
InformationsquelleAutor der Antwort Elister
Als @Bozho erwähnt, ist es möglich, es zu tun, wenn debug-Informationen enthalten, die während der Kompilierung.
Es gibt eine gute Antwort hier...
Wie man die Namen der parameter eines Objekts Konstruktoren (Reflexion)? durch
@AdamPaynter
...mit der ASM-Bibliothek. Ich habe ein Beispiel zeigt, wie Sie Ihr Ziel erreichen.
Starten Sie als erstes mit einem pom.xml mit diesen Abhängigkeiten.
Dann, diese Klasse soll das tun, was Sie wollen. Einfach aufrufen der statischen Methode
getParameterNames()
.Hier ist ein Beispiel mit einem unit-test.
Können Sie finden das vollständige Beispiel auf GitHub
Vorsichtsmaßnahmen
static
Methoden. Dies ist, weil in diesem Fall die Anzahl der Argumente zurück durch ASM ist anders, aber es ist etwas, das leicht behoben werden können.InformationsquelleAutor der Antwort danidemi
Es ist nicht möglich, mit Reflexion aber , ich war in der Lage, um die Namen der parameter ohne übergabe-Parameter argument mit paranamer.jar Bibliothek. Es war ziemlich einfach, auch. Wenn jemand auf der Suche nach alternativen Möglichkeiten, geben diesem einen Versuch. 🙂
InformationsquelleAutor der Antwort Ash