Jeśli mam taką klasę:
public class Whatever
{
public void aMethod(int aParam);
}
czy istnieje sposób, aby dowiedzieć się, że aMethod
używa parametru o nazwie aParam
, czyli typu int
?
java
reflection
Geo
źródło
źródło
Odpowiedzi:
Podsumowując:
method.getParameterTypes()
Ze względu na pisanie funkcji autouzupełniania dla edytora (jak wspomniałeś w jednym z komentarzy) jest kilka opcji:
arg0
,arg1
,arg2
itd.intParam
,stringParam
,objectTypeParam
, itd.źródło
W Javie 8 możesz wykonać następujące czynności:
Więc dla Twojej klasy
Whatever
możemy wykonać test manualny:który powinien zostać wydrukowany,
[aParam]
jeśli przekazałeś-parameters
argument do kompilatora Java 8.Dla użytkowników Maven:
Aby uzyskać więcej informacji, zobacz następujące łącza:
źródło
Biblioteka Paranamer została stworzona, aby rozwiązać ten sam problem.
Próbuje określić nazwy metod na kilka różnych sposobów. Jeśli klasa została skompilowana z debugowaniem, może wyodrębnić informacje, odczytując kod bajtowy klasy.
Innym sposobem jest wstrzyknięcie prywatnego statycznego elementu członkowskiego do kodu bajtowego klasy po jej skompilowaniu, ale przed umieszczeniem go w słoiku. Następnie używa odbicia, aby wyodrębnić te informacje z klasy w czasie wykonywania.
https://github.com/paul-hammant/paranamer
Miałem problemy z używaniem tej biblioteki, ale w końcu udało mi się ją uruchomić. Mam nadzieję zgłosić ten problem opiekunowi.
źródło
ParameterNAmesNotFoundException
zobacz klasę org.springframework.core.DefaultParameterNameDiscoverer
źródło
Tak.
Kod musi być skompilowany za pomocą kompilatora zgodnego z Javą 8 z włączoną opcją przechowywania formalnych nazw parametrów ( opcja -parameters ).
Wtedy ten fragment kodu powinien działać:
źródło
Możesz pobrać metodę z odbiciem i wykryć jej typy argumentów. Sprawdź http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Jednak nie możesz podać nazwy użytego argumentu.
źródło
Jest to możliwe i Spring MVC 3 to robi, ale nie poświęciłem czasu, aby zobaczyć, jak to zrobić.
Zaczerpnięte z dokumentacji wiosennej
źródło
Chociaż nie jest to możliwe (jak inni rysunku), to mógłby użyć adnotacji o przeniesienie nazwę parametru, a uzyskanie że chociaż refleksji.
Nie jest to najczystsze rozwiązanie, ale spełnia swoje zadanie. Niektóre usługi sieciowe faktycznie robią to, aby zachować nazwy parametrów (np. Wdrażanie WS z Glassfish).
źródło
Zobacz java.beans.ConstructorProperties , jest to adnotacja zaprojektowana właśnie do tego.
źródło
Więc powinieneś być w stanie zrobić:
Ale prawdopodobnie otrzymasz taką listę:
Wierzę, że zostanie to naprawione w Groovy 2.5+
Tak więc obecnie odpowiedź brzmi:
Zobacz też:
Dla każdej metody wtedy coś takiego:
źródło
aMethod
. Chcę to uzyskać dla wszystkich metod w klasie.antlr
do uzyskania nazw parametrów dla tego?jeśli używasz eclipse, zobacz poniższy obrazek, aby umożliwić kompilatorowi przechowywanie informacji o parametrach metody
źródło
Jak stwierdził @Bozho, można to zrobić, jeśli podczas kompilacji zostaną uwzględnione informacje o debugowaniu. Tutaj jest dobra odpowiedź ...
Jak uzyskać nazwy parametrów konstruktorów obiektu (odbicie)? przez @AdamPaynter
... używając biblioteki ASM. Przygotowałem przykład pokazujący, jak możesz osiągnąć swój cel.
Przede wszystkim zacznij od pom.xml z tymi zależnościami.
Następnie ta klasa powinna robić, co chcesz. Po prostu wywołaj metodę statyczną
getParameterNames()
.Oto przykład z testem jednostkowym.
Kompletny przykład można znaleźć na GitHub
Ostrzeżenia
static
metodami. Dzieje się tak dlatego, że w tym przypadku liczba argumentów zwracanych przez ASM jest różna, ale jest to coś, co można łatwo naprawić.źródło
Nazwy parametrów są przydatne tylko dla kompilatora. Gdy kompilator generuje plik klasy, nazwy parametrów nie są uwzględniane - lista argumentów metody składa się tylko z liczby i typów jej argumentów. Dlatego nie byłoby możliwe pobranie nazwy parametru za pomocą refleksji (tak jak zostało to zaznaczone w Twoim pytaniu) - nigdzie nie istnieje.
Jeśli jednak użycie odbicia nie jest trudnym wymaganiem, możesz pobrać te informacje bezpośrednio z kodu źródłowego (zakładając, że je masz).
źródło
Parameter names are only useful to the compiler.
Źle. Spójrz na bibliotekę Retrofit. Wykorzystuje dynamiczne interfejsy do tworzenia żądań REST API. Jedną z jego funkcji jest możliwość definiowania nazw symboli zastępczych w ścieżkach adresów URL i zastępowania tych symboli zastępczych odpowiadającymi im nazwami parametrów.Aby dodać moje 2 centy; Informacje o parametrach są dostępne w pliku klasy „do debugowania”, gdy używasz javac -g do kompilowania źródła. Jest dostępny dla APT, ale będziesz potrzebować adnotacji, więc nie będzie dla ciebie pożytku. (Ktoś omawiał coś podobnego 4-5 lat temu tutaj: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Krótko mówiąc, nie możesz tego dostać, chyba że pracujesz bezpośrednio na plikach źródłowych (podobnie do tego, co robi APT w czasie kompilacji).
źródło