Java反射:从实现类中获取通用接口的类型参数

Héc*_*tor 6 java reflection

我有这个界面:

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但我不知道哪个.

Ren*_*ink 6

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>.