I have this interface:
public interface EventHandler {
void handle(T event);
}
And this class implementing it:>
When trying to do anything non-trivial with generics and reflection, consider Guava's TypeToken
:
private interface Event {}
private interface EventHandler {
void handle(T event);
}
TypeToken> findEventType(final Class extends EventHandler> handlerClass) throws Exception {
final TypeToken extends EventHandler> handlerTypeToken = TypeToken.of(handlerClass);
final Invokable extends EventHandler,Object> method = handlerTypeToken.method(EventHandler.class.getDeclaredMethod("handle", Event.class));
return method.getParameters().get(0).getType();
}
public void testExploreGuavaTypeTokens() throws Exception {
class MyEvent implements Event {}
class MyEventHandler implements EventHandler {
@Override public void handle(final MyEvent event) {}
}
assertEqual(MyEvent.class, findEventType(MyEventHandler.class).getRawType());
}
(Note that the TypeToken
returned by findEventType()
could contain much richer type information than a Class
can represent; that's why it's the caller's decision whether to simplify it via getRawType()
.)