2015-02-19 7 views
0

У меня есть код, который нужно разблокировать Jackson TypeReference, чтобы узнать, является ли это коллекцией. На данный момент лучшее, что я могу придумать это:Получить класс от Jackson TypeReference

// Sample type reference - in reality this is an argument to the method 
final TypeReference<List<String>> typeRef = new TypeReference<List<String>>(){}; 

// Obtain the Java reflection type from the TypeReference 
final Type type = typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType(); 

// Obtain the name of the class (or interface) 
final String typeName = type.toString().replace("class ", "").replace("interface ", ""); 

// And find out if it is a Collection 
final boolean isCollection = Collection.class.isAssignableFrom(Class.forName(typeName)); 

Но я надеюсь, что есть способ сделать это без манипуляций со строками. Есть ли лучший способ перейти от Java Type к Class, или действительно проверить назначаемость непосредственно из TypeReference или Type?

Это должно работать на Android, поэтому любые функции, добавленные в Java 8, не могут быть использованы.

+1

Можете ли вы просто напечатать тип, возвращенный во второй строке класса? (Class) typeRef.getType() – Sashi

+0

Спасибо за ответ. К сожалению, я не могу использовать его, потому что typeRef.getType() возвращает Java 'Type' не класс. – jgm

ответ

2

Основываясь на линии кода,

final Type type = typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType(); 

Вы можете смело бросить его в класс, как этот

final Class clazz = (Class)(typeRef.getType() instanceof ParameterizedType ? ((ParameterizedType)typeRef.getType()).getRawType() : typeRef.getType()); 

Чтобы добавить немного больше объяснений -

В первом сценарии где (typeRef - это экземпляр ParameterizedType), вы извлекаете rawType, который будет классом.

Во втором сценарии, где (typeRef не является экземпляром ParameterizedType), он все равно будет обычным классом, потому что он не параметризирован.

+0

Thanks; Я слишком быстро перебрасывался, когда я пробовал это раньше, и пытался применить «ParameterizedTypeImpl» к классу, поэтому он не работал раньше. – jgm

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