2015-06-02 3 views
2

У меня есть метод Java со следующей подписью:Java Reflection, извлечь общий тип из метода

static <ContentType> Map<Object,ContentType> foo(); 

Я хочу использовать отражение для динамического изменения поведения метода согласно ContentType. Для этого я должен иметь возможность обрабатывать ContentType как объект (возможно, экземпляр java.lang.reflect.Type). Кто-нибудь знает, как это сделать? Возможно ли это событие?

+0

это не будет возможно, до Явы 9 из-за типа стирания. –

+0

Единственный способ сделать это - добавить аргумент: static Map foo (класс ); –

+0

или, конечно же, тестирование содержимого карты. –

ответ

2

Невозможно. Дженерики в Java - это «синтаксический сахар». Они используются только во время компиляции, но затем удаляются и не попадают в файл класса.

This question имеет некоторые действительно хорошие сведения об этом.

+0

Примечание: Вероятно, это возможно из Java 9. –

+1

@Arnaud: Это довольно круто ... Не могли бы вы поделиться ссылкой? –

+0

@ArnaudDenoyelle Почему вы говорите, что это возможно в Java 9? Если вы говорите об общих изменениях, включенных в состав [предложение типов значений] (http://openjdk.java.net/jeps/169), который в настоящее время предназначен для Java 10 (и очень далек от завершения, так что это может оказаться невозможным). – Toby

1

Во время выполнения проверки самого параметрируемого типа, например java.util.List, нет способа узнать, для какого типа была параметризована. Но, когда вы проверяете метод, который декларирует использование параметризованных типов, вы можете увидеть во время выполнения какого типа параметризуемого типа был параметрироваться к

Method method = MyClass.class.getMethod("getStringList", null); 

Type returnType = method.getGenericReturnType(); 
if(returnType instanceof ParameterizedType){ 
    ParameterizedType type = (ParameterizedType) returnType; 
    Type[] typeArguments = type.getActualTypeArguments(); 
    for(Type typeArgument : typeArguments){ 
     Class typeArgClass = (Class) typeArgument; 
     System.out.println("typeArgClass = " + typeArgClass); 
    } 
} 
Смежные вопросы