2017-02-16 7 views
1

Если у меня есть класс, как так:Начало напечатал возвращение метода с помощью Java Reflection

class Test { 
    Thing<String> getThing(String thing) {} 
} 

, как я могу определить, String.class с помощью отражения на примере теста? Путь, который я хочу принять, - это новый тест() -> get class -> find method -> get return type -> -> каким-то образом получить String.class, но я не нахожу, как выполняется последняя часть. То, что я до сих пор получает, Thing<java.lang.String>, но не внутренний класс.

import org.reflections.ReflectionUtils; 

Iterables.getOnlyElement(ReflectionUtils.getAllMethods((new Test()).getClass())).getGenericType(); 

тогда .getReturnType() просто получает мне Thing.class ...

+1

[Тип стирание] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). –

+0

ОК, им не видно, как это использовать – mathematician

+0

Что делать, если это не общий тип, и он всегда является строкой – mathematician

ответ

1

В Java вы можете получить его с помощью стандартного Reflection API (нет необходимости использовать ReflectionUtils). Вы правильно использовали getGenericReturnType. Вам просто нужно, чтобы бросить его ParameterizedType:

public static void main(String[] args) throws NoSuchMethodException { 
    Method m = Test.class.getDeclaredMethod("getThing", String.class); 
    Type type = m.getGenericReturnType(); 
    // type is Thing<java.lang.String> 
    if(type instanceof ParameterizedType) { 
     Type[] innerTypes = ((ParameterizedType) type).getActualTypeArguments(); 
     if(innerTypes.length == 1) { 
      Type innerType = innerTypes[0]; 
      if(innerType instanceof Class) { 
       // innerType is java.lang.String class 
       System.out.println(((Class<?>) innerType).getName()); 
      } 
     } 
    } 
} 
+0

perfect! благодаря! – mathematician

+0

@mathematician, на самом деле он еще проще (и работает даже в Java 1.5), проверьте обновленный ответ. –

Смежные вопросы