如何在Java中将Field转换为Set类?

时间:2013-08-10 07:37:42

标签: java reflection

如果字段为Set<String>,如何确定Set(在这种情况下为String)的通用类型?

我有这个方法来确定泛型类型:

private boolean isSetTypeOf( Set<?> set, Class<?> clazz )
{
    for ( Object object : set )
    {
        if ( object.getClass().equals( clazz ) )
        {
            return true;
        }
    }
    return false;
}

但我不能将Field转换为Set,因此无法使用此方法。

Field field = getTheField();

if ( ReflectionUtils.isType( field, Set.class )
{
    // Error
    if ( isSetTypeOf( field, clazz ) )
    {
        // do something
    }
}

基本上我知道字段类型是一个Set,现在我需要知道集合所持有的对象的类型,然后才会使用该字段。

3 个答案:

答案 0 :(得分:2)

假设您的类中有Field类型字段对应的Set类型,您可以使用以下代码找出参数化类型:

Type type = field.getGenericType();   // Get the generic type of the Field, 

if (type instanceof ParameterizedType) {
    System.out.println("Parameterized type for : " + type);

    ParameterizedType pType = (ParameterizedType) type;
    Type[] types = pType.getActualTypeArguments();

    for (Type aType: types) {
        System.out.println(aType);
    }
}

对于Set<String>类型字段,将输出:

Parameterized type for : java.util.Set<java.lang.String>
class java.lang.String

使用isSetTypeOf方法不会为您提供参数化类型,而是Set中存储的元素的实际类型。

答案 1 :(得分:1)

试试这个object.getClass().isAssignableFrom(clazz)

答案 2 :(得分:1)

这样做

if ( isSetTypeOf( new HashSet().add(field), clazz ) )

而不是:

if ( isSetTypeOf( field, clazz ) )