来自规范名称的java.lang.reflect.Type

时间:2016-09-28 10:39:08

标签: java reflection

是否可以从其规范名称实例化java.lang.reflect.Type?

例如,从" java.util.List"。

创建一个Type

由于

1 个答案:

答案 0 :(得分: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