dimanche 9 juillet 2017

How do I get the argument of the formal method parameter type?

I have methods with a single parameter of type Event<Something> and need to extract the Something or its raw type. It may look like

 void method1(Event<MyEnum1> event) {}
 <E extends Enum<E>> method2(Event<E> event) {}
 <K, V> method3(Event<Map<K, V>> event) {}

and I'd like a function mapping

method1 -> MyEnum.class
method2 -> Enum.class
method3 -> Map.class

For method1, it's easy using (ParameterizedType) method.getGenericParameterTypes(). For method2, I can use Guava

TypeToken.of(method.getDeclaringClass())
    .method(method)
    .getTypeParameters()[0]
    .getBounds()

to obtain a Type and

TypeToken.of(method.getDeclaringClass())
    .method(method)
    .getParameters()
    .get(0)

to obtain the Parameter. I guess, I need to resolve the Parameter using the Type, but I'm stuck here.

I don't care much about method3, though it'd be good to know a general way. I don't care about the type of actual parameters (I'm aware of the erasure).





Aucun commentaire:

Enregistrer un commentaire