我有这个界面:
public interface EventHandler<T extends Event> {
void handle(T event);
}
Run Code Online (Sandbox Code Playgroud)
而这个类实现它:
public class MyEventHandler implements EventHandler<MyEvent> {
@Override
public void handle(MyEvent event) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于:
Class myEventHandlerClass = getClazz();
Run Code Online (Sandbox Code Playgroud)
在这个条款中,T参数是MyEvent,这是一个具体的实现Event.如何使用反射获得这个?
我想要这样的东西:
Class myEventHandlerClass = getClazz();
Method handleMethod = myEventhandlerClass.getDeclaredMethod("handle");
Class<?>[] params = method.getParameterTypes();
Class<?> eventConcreteType = params[0];
Run Code Online (Sandbox Code Playgroud)
但myEventhandlerClass.getDeclaredMethod("handle");抛出NoSuchMethodException,因为我没有指定参数类型,因为我只知道这是一个具体的实现,Event但我不知道哪个.
T通过通用接口解析类型.例如
public interface SomeInterface<T> {
}
public class SomeImplementation implements SomeInterface<String> {
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());
}
Run Code Online (Sandbox Code Playgroud)
PS:请记住,acutalTypeArguments属于类型Type.他们一定不是Class.在您的情况下,它是一个类,因为您的类型定义是EventHandler<MyEvent>.