我有这个界面:
public interface EventHandler{ void handle(T event); }
而这个类实现它:
public class MyEventHandler implements EventHandler{ @Override public void handle(MyEvent event) { //do something } }
鉴于:
Class myEventHandlerClass = getClazz();
在这个条款中,T
参数是MyEvent
,这是一个具体的实现Event
.如何使用反射获得这个?
我想要这样的东西:
Class myEventHandlerClass = getClazz(); Method handleMethod = myEventhandlerClass.getDeclaredMethod("handle"); Class>[] params = method.getParameterTypes(); Class> eventConcreteType = params[0];
但myEventhandlerClass.getDeclaredMethod("handle");
抛出NoSuchMethodException
,因为我没有指定参数类型,因为我只知道这是一个具体的实现,Event
但我不知道哪个.
T
通过通用接口解析类型.例如
public interface SomeInterface{ } public class SomeImplementation implements SomeInterface { public Class getGenericInterfaceType(){ Class clazz = getClass(); ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericInterfaces()[0]; Type[] typeArguments = parameterizedType.getActualTypeArguments(); Class> typeArgument = (Class>) typeArguments[0]; return typeArgument; } } public static void main(String[] args) { SomeImplementation someImplementation = new SomeImplementation(); System.out.println(someImplementation.getGenericInterfaceType()); }
PS:请记住,acutalTypeArguments属于类型Type
.他们一定不是Class
.在您的情况下,它是一个类,因为您的类型定义是EventHandler
.