Tôi sử dụng một phương pháp duy nhất đóng gói lấy phương pháp đích và sau đó gọi phương thức đó. Có lẽ có một số hạn chế, tất nhiên. Dưới đây là phương pháp đưa vào một lớp học và thử nghiệm JUnit của nó:
public class Invoker {
/**
* Get method and invoke it.
*
* @author jbetancourt
*
* @param name of method
* @param obj Object to invoke the method on
* @param types parameter types of method
* @param args to method invocation
* @return return value
* @throws Exception for unforseen stuff
*/
public static final <T> Object invokeMethod(final String name, final T obj,
final Class<?>[] types, final Object... args) throws Exception {
Method method = obj.getClass().getDeclaredMethod(name, types);
method.setAccessible(true);
return method.invoke(obj, args);
}
/**
* Embedded JUnit tests.
*/
@RunWith(JUnit4.class)
public static class InvokerTest {
/** */
@Test
public void testInvoke() throws Exception {
class TestTarget {
private String hello() {
return "Hello world!";
}
}
String actual = (String) Invoker.invokeMethod("hello",
new TestTarget(), new Class<?>[] {});
String expected = "Hello world!";
assertThat(actual, is(expected));
}
}
}
Nguồn
2013-01-14 01:21:51
thử 'MyClass.class.getDeclaredMethod ("myMethod", Map.class); 'cho trường hợp của bạn – Cratylus
Funnily đủ các generic thông tin của phương thức vẫn có sẵn khi chạy. 'Method.getGenericParameterTypes' –