Jeśli mam dwie zmienne:
Object obj;
String methodName = "getName";
Nie znając klasy obj
, jak mogę wywołać metodę identyfikowaną przez methodName
nią?
Wywoływana metoda nie ma parametrów i String
zwraca wartość. To jest getter dla fasoli Java .
java
reflection
invoke
brasskazoo
źródło
źródło
Odpowiedzi:
Kodowanie z biodra wyglądałoby to tak:
Parametry określają bardzo konkretną metodę, której potrzebujesz (jeśli istnieje kilka przeciążonych dostępnych metod, jeśli metoda nie ma argumentów, podaj tylko
methodName
).Następnie wywołujesz tę metodę, wywołując
Ponownie pomiń argumenty
.invoke
, jeśli ich nie masz. Ale tak. Przeczytaj o Java Reflectionźródło
method
wmethod.invoke(obj, arg1, arg2,...);
. Amethod = null;
rozwiązuje problem, ale o tym wspomnieć w odpowiedzi nie jest złym pomysłem.invoke
co zwróciło. Jeśli wystąpi wyjątek prowadzenie sposobu, wyjątek nie zostanie owinięty w sposóbInvocationTargetException
.Użyj wywołania metody z refleksji:
Gdzie:
"class name"
to nazwa klasyobjectToInvokeOn
jest typu Object i jest obiektem, na którym chcesz wywołać metodę"method name"
to nazwa metody, którą chcesz wywołaćparameterTypes
jest typuClass[]
i deklaruje parametry, które przyjmuje metodaparams
jest typuObject[]
i deklaruje parametry, które należy przekazać do metodyźródło
Dla tych, którzy chcą prostego przykładu kodu w Javie 7:
Dog
klasa:ReflectionDemo
klasa:Wynik:
Mishka is 3 year(s) old.
Możesz wywołać konstruktor z parametrami w ten sposób:
Alternatywnie możesz usunąć
i robić
Sugerowana lektura: Tworzenie nowych wystąpień klasy
źródło
Method
przedmiot?Metodę można wywołać w ten sposób. Jest też więcej możliwości (sprawdź API odbicia), ale ta jest najprostsza:
źródło
Po pierwsze nie. Unikaj tego rodzaju kodu. Zazwyczaj jest to bardzo zły kod i niepewny (patrz sekcja 6 Wytycznych bezpiecznego kodowania dla języka programowania Java, wersja 2.0 ).
Jeśli musisz to zrobić, wolę java.beans od refleksji. Fasola otacza odbicie, umożliwiając względnie bezpieczny i konwencjonalny dostęp.źródło
Aby uzupełnić odpowiedzi mojego kolegi, możesz zwrócić szczególną uwagę na:
Oto stary kod java1.4, który uwzględnia te punkty:
źródło
źródło
źródło
Jeśli wykonasz to wywołanie kilka razy, możesz użyć nowych uchwytów metod wprowadzonych w Javie 7. Oto twoja metoda zwracająca ciąg znaków:
źródło
invokeExact
kiedy tylko możesz. W tym celu podpis witryny wywołującej musi jednak dokładnie odpowiadać typowi uchwytu metody. Zazwyczaj zajmuje trochę majsterkowania. W takim przypadku musisz rzucić pierwszy parametr za pomocą:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
a następnie wywołać jakString result = (String) methodHandle.invokeExact(obj);
To brzmi jak coś, co można zrobić z pakietem Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Szczególnie w części Wywoływanie metod według nazwy:
import java.lang.reflect. *;
źródło
Indeksowanie (szybciej)
Możesz użyć
FunctionalInterface
do zapisania metod w kontenerze, aby je zindeksować. Możesz użyć kontenera tablic, aby wywoływać je za pomocą liczb lub haszapa, aby wywoływać je za pomocą ciągów. Dzięki tej sztuczce możesz indeksować swoje metody, aby wywoływać je dynamicznie szybciej .Składnia lambda
Możesz także użyć składni lambda:
źródło
O(1)
.SomeClass
jest klasą isomeVariable
jest zmienną.źródło
Robię to w ten sposób:
źródło
Zapoznaj się z poniższym kodem, który może ci pomóc.
Dzięki....
źródło
Oto GOTOWE DO UŻYCIA METODY:
Aby wywołać metodę bez argumentów:
Aby wywołać metodę za pomocą argumentów:
Użyj powyższych metod, jak poniżej:
Wynik:
źródło
Student.java
StudentTest.java
źródło
Powinieneś użyć refleksji - zainicjuj obiekt klasy, następnie metodę w tej klasie, a następnie wywołaj tę metodę na obiekcie z opcjonalnymi parametrami. Pamiętaj, aby owinąć następujący fragment kodu w bloku try-catch
Mam nadzieję, że to pomoże!
źródło
To działa dobrze dla mnie:
}
Wynik:
My input testparam
Jestem w stanie wywołać metodę, przekazując jej nazwę do innej metody (np. Main).
źródło
za pomocą
import java.lang.reflect.*;
i oto jak z niego korzystasz:
źródło
W jooR jest to po prostu:
Oto bardziej skomplikowany przykład:
To drukuje:
źródło
dla mnie dość prostym i głupim sposobem byłoby po prostu stworzenie metody wywołującej metodę, takiej jak:
wtedy, gdy musisz wywołać metodę, po prostu umieść coś takiego
źródło
className.getName().toString()
? Brakuje ci całego punktu refleksji.