Wywoływanie metody statycznej za pomocą odbicia


198

Chcę wywołać mainmetodę, która jest statyczna. Mam obiekt typu Class, ale nie jestem w stanie utworzyć instancji tej klasy, a także nie mogę wywołać staticmetody main.

Odpowiedzi:


290
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

W przypadku, gdy metoda jest prywatna, getDeclaredMethod()zamiast getMethod(). I wywołaj setAccessible(true)obiekt metody.


49

Z Javadoc metody Method.invoke ():

Jeśli podstawowa metoda jest statyczna, to podany argument obj jest ignorowany. Może być zerowy.

Co się stanie, kiedy ty

Klasa klass = ...;
Metoda m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}

11
Dlaczego nie użyć getMethod z poprawną nazwą zamiast zapętlać wszystkie metody?
mjaggard,

11
Czasami o wiele łatwiej jest zapętlić i znaleźć metodę według nazwy niż użyć getMethod, ponieważ getMethod (lub getDeclaredMethod) wymaga szczegółowego opracowania typów parametrów. To zależy tylko od tego, czy liczy się mikroefektywność - iteracja Java jest bardzo szybka, więc jeśli nie wywołasz tej metody miliony razy w wewnętrznej pętli, iteracja będzie wystarczająco szybka
Tony Eastwood

2
Również w bardziej rzeczywistej sytuacji prawdopodobnie znajdziesz tę metodę tylko raz, nawet jeśli zamierzasz użyć refleksji, aby wywołać ją wiele razy. Tak więc dodatkowe koszty ogólne przy znajdowaniu go są nieistotne.
RenniePet

4
Będę miał zły czas z przeciążonymi metodami.
Ulysse Mizrahi

1
@UlysseMizrahi wszystko zależy od tego, na co pasujesz, ale tak, jeśli piszesz kod biblioteki, poleganie tylko na nazwie może być niebezpieczne. Zazwyczaj sprawdzam konkretną adnotację lub podpis określonej metody, na przykład „metoda statyczna, która pobiera ciąg znaków i zwraca instancję klasy”, a następnie stwierdzam, że znaleziono tylko jedną taką metodę.
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

W powyższym przykładzie „add” jest metodą statyczną, która przyjmuje za argument dwie liczby całkowite.

Poniższy fragment kodu służy do wywołania metody „dodaj” z danymi wejściowymi 1 i 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Link referencyjny .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.