使用反射检索泛型类型信息

时间:2014-04-09 05:41:34

标签: java reflection

我们假设我有这些课程,

public class StringObjectKeyValueStore<V> extends AbstractObjectStore<V>
        implements KeyValueStore<String, V> {
}

public abstract class AbstractObjectStore<V> {
     private final Class<V> type;
     public AbstractObjectStore() {
        this.type = (Class<V>) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
}

我这样使用它:

KeyValueStore<String,Friend> friendstore = new StringObjectKeyValueStore();

AbstractObjectStore中如何在不修改com.xzvf.models.Friend构造函数并在其中传递AbstractObjectStore的情况下获取Class<V> clazz

从我调试这部分

((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];

只需返回name = {java.lang.String@1452} "V"

2 个答案:

答案 0 :(得分:1)

你做不到。不可能。

首先,Class#getGenericSuperclass()

  

返回表示实体的直接超类的Type   (类,接口,基本类型或void)由此类表示。

因此对于StringObjectKeyValueStore,直接超类是AbstractObjectStoreParameterizedType,因为它是使用类型变量进行参数化的。 ParamerizedTypegetActualTypeArguments方法

  

返回一个Type对象数组,表示此类型的实际类型参数。

对于你的例子,即。 StringObjectKeyValueStore,通用超类是AbstractObjectStore,在StringObjectKeyValueStore类声明中给出了单个类型参数,

public class StringObjectKeyValueStore<V> extends AbstractObjectStore<V>

即。类型变量V。所以,对于

KeyValueStore<String,Friend> = new StringObjectKeyValueStore();

此代码

((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];

将返回类型变量TypeVariableImpl的{​​{1}}对象。

如果您的声明是

V

然后

public class StringObjectKeyValueStore<V> extends AbstractObjectStore<String>
                                                                   // ^ see here

将返回((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; 的{​​{1}}对象,因为Class是您使用的实际类型参数。

答案 1 :(得分:1)

这是可行的唯一方法是,如果你继承StringObjectKeyValueStore

class FriendStore extends StringObjectKeyValueStore<Friend>{}

您可以使用TypeTools解析特定类型的V,例如KeyValueStore

Class<?> v = TypeResolver.resolveRawArguments(KeyValueStore.class, FriendStore.class)[1];
assert v == Friend.class;