2016-09-28 2 views
0

Возможно ли создать экземпляр java.lang.reflect.Type из его канонического имени?java.lang.reflect.Type from canonical name

Например, создайте тип из "java.util.List".

Благодаря

+0

Если это просто класс, вы можете использовать 'Class.forName'. –

+0

Спасибо @LouisWasserman, но это не просто класс, так как это каноническое представление может быть чем-то вроде «java.util.List ». Я нашел решение для этого, я добавил его к моему первоначальному вопросу. – halfwarp

+0

Если вы нашли решение, вы должны добавить ответ. – Holger

ответ

0

Класс является типа и так же 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