1. 背景
java.lang.Class 下有如下方法:
Method getMethod(String name, Class<?>... parameterTypes);
但是,使用该方式获取 Method 不能以多态方式传入方法参数。
比如,有这样的方法:
void handleEvent(Event event)
传入的参数 event 都是 com.sun.tools.jdi.EventSetImpl.EventSetImpl 下的内部类,这些内部类都是是 com.sun.jdi.event.XxxEvent 的实现类,比如 com.sun.tools.jdi.EventSetImpl$ThreadStartEventImpl。但我们设计的方法是这样的:
void handleThreadStartEvent(ThreadStartEvent event)
因此,如果通过这样的方式是无法获取到 Method 的,将会抛出 NoSuchMethodException:
Class<? extends Event> eventClass = event.getClass();
this.getClass().getMethod("handle" + eventClass.getSimpleName(), eventClass);
2. 解决方案
获取接口
Class<?> eventClass = event.getClass().getInterfaces()[0];
Method method = this.getClass().getMethod("handle" + eventClass.getSimpleName(), eventClass);