7

我为称为 ASN.1 的文件格式编写了一个解析器,它使用 GuiceTypeLiteral.getFieldType(Field)将通用字段转换为特定的 Java 类型,以便我可以构造正确的类型(类似于 Jackson 或 GS​​ON 数据绑定)。但由于我已经依赖 Guava 并且它似乎有一个新的 TypeLiteral 替代品,我想TypeToken改用它。根据Guave TypeToken 文档

TypeToken类似于 Guice 的TypeLiteral类,但有一个重要区别:它支持非具体类型,例如T,List<T>甚至List<? extends Number>; 而TypeLiteral没有。TypeToken也是可序列化的,并提供了许多额外的实用方法。

您可以使用 获得字段的具体类型TypeToken吗?换句话说,如何在 Guava 中执行以下操作?

import org.junit.Test;
import com.google.inject.TypeLiteral;
public class FieldTypeTest {
    public static class A<T> {
        T a;
    }
    public static class B {
        A<String> b;
    }

    @Test
    public void testTypeToken() throws SecurityException, NoSuchFieldException {
        TypeLiteral<?> reifiedA = TypeLiteral.get(B.class).getFieldType(B.class.getDeclaredField("b"));
        assertEquals(String.class, reifiedA.getFieldType(reifiedA.getRawType().getDeclaredField("a")).getRawType());
    }
}
4

1 回答 1

8

从我的头,未验证

Type t = B.class.getDeclaredField("b").getGenericType();
Class<?> p = TypeToken.of(t).resolve(
        /* T */  A.getTypeParameters()[0]).getRawType();
// p should be String.class
于 2012-11-20T05:16:30.643 回答