2010-03-18 27 views

Odpowiedz

213
// 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 metoda jest prywatne korzystanie getDeclaredMethod() zamiast getMethod(). I zadzwoń pod numer setAccessible(true) na obiekcie metody.

9
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; 
    } 
} 
+10

Dlaczego nie używać getMethod z poprawną nazwą zamiast pętli przez wszystkie metody? – mjaggard

+9

Czasami łatwiej jest zapętlić i znaleźć metodę po nazwie, niż użyć getMethod, ponieważ getMethod (lub getDeclaredMethod) wymaga dokładnego opracowania typów parametrów. To zależy od tego, czy wydajność mikro ma znaczenie - iteracja Java jest bardzo szybka, więc jeśli nie wywołasz tej metody miliony razy w jakiejś wewnętrznej pętli, iteracja będzie wystarczająco szybka. –

+2

Również w bardziej realnej sytuacji prawdopodobnie znajdziesz tylko Metoda raz, nawet jeśli zamierzasz użyć refleksji, aby wywołać ją wiele razy. Tak więc dodatkowe koszty, gdy się go znajduje, są nieistotne. – RenniePet

34

fromthe Javadoc z Method.invoke():

Jeżeli sposób bazową jest statyczny, a następnie określono obj argumentu jest ignorowana. Może być pusty.

Co się dzieje, kiedy

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args) 
Powiązane problemy