0
Возможно ли создать экземпляр java.lang.reflect.Type из его канонического имени?java.lang.reflect.Type from canonical name
Например, создайте тип из "java.util.List".
Благодаря
Возможно ли создать экземпляр java.lang.reflect.Type из его канонического имени?java.lang.reflect.Type from canonical name
Например, создайте тип из "java.util.List".
Благодаря
Класс является типа и так же java.lang.Class
реализовать java.lang.reflect.Type
.
Другими словами, вы можете просто написать
java.lang.reflect.Type listType=java.util.List.class;
или
java.lang.reflect.Type listType=Class.forName("java.util.List");
Если тип является универсальным, Class
экземпляр может стоять необработанном типа или общий (параметризуемый) типа, в зависимости от контекста, например
static void checkType(Class<?> type, Class<?> implemented) {
if(!implemented.isAssignableFrom(type)) {
System.out.println(type+" is not a subtype of "+implemented);
}
else if(implemented.isInterface()) {
for(Type t: type.getGenericInterfaces()) {
if(t==implemented) {
System.out.println(type+" implements raw "+implemented);
}
else if(t instanceof ParameterizedType) {
ParameterizedType pt=(ParameterizedType)t;
if(pt.getRawType()==implemented) {
System.out.println(type+" implements "+implemented+" with");
TypeVariable<?>[] p = implemented.getTypeParameters();
Type[] actual = pt.getActualTypeArguments();
assert p.length==actual.length;
for(int i=0; i<actual.length; i++)
System.out.println("\t"+p[i]+" := "+actual[i]);
}
}
}
}
}
abstract class RawList implements List {}
checkType(RawList.class, List.class);
abstract class StringToIntMap implements Map<String,Integer> {}
checkType(StringToIntMap.class, Map.class);
печатает
class Test$1RawList implements raw interface java.util.List
class Test$1StringToIntMap implements interface java.util.Map with
K := class java.lang.String
V := class java.lang.Integer
Если это просто класс, вы можете использовать 'Class.forName'. –
Спасибо @LouisWasserman, но это не просто класс, так как это каноническое представление может быть чем-то вроде «java.util.List». Я нашел решение для этого, я добавил его к моему первоначальному вопросу. –
halfwarp
Если вы нашли решение, вы должны добавить ответ. – Holger