我有以下两节课:

class Generic<T>
{

}

class Foo extends Generic<Student>
{

}


Generic内部,我有一个方法,该方法需要获取通过T传递的类的名称。

这在Java中可行吗?我知道在C#中,我只会使用typeof

我尝试执行以下操作:

String className = new TypeToken<T>() {}.getClass().getName().toString();


但是,此名称不提供名称,仅提供Generic$1

最佳答案

使用getGenericSuperclass()方法并检查是否为ParameterizedType
然后使用getActualTypeArguments()获取所有参数,这些参数返回Type数组,
请记住,泛型类可能使用不止一种类型,例如Map(Map )

public Class<?> getGenericType(Object obj) {
    Class<?> genericType = null;
    Type gnrcType = obj.getClass().getGenericSuperclass();
    if (gnrcType instanceof ParameterizedType) {
        ParameterizedType parameterizedType = (ParameterizedType) gnrcType;
        Type types[] = parameterizedType.getActualTypeArguments();

        if (types != null && types.length > 0) {
            Type type = types[0];
            if (type instanceof Class) {
                genericType = (Class<?>) type;
            }
        }
    }
    return genericType;
}

09-27 09:59