我有这个界面:
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.他们不能是一个阶级.在您的情况下,它是一个类,因为您的类型定义是EventHandler< MyEvent>.
标签:java,reflection
来源: https://codeday.me/bug/20190519/1136130.html