我为名为ASN.1的文件格式编写了一个解析器,该解析器使用Guice TypeLiteral.getFieldType(Field)将通用字段转换为特定的Java类型,以便构造正确的类型(类似于Jackson或GSON数据绑定)。但是由于我已经依赖Guava了,而且它似乎有一个新的TypeLiteral替代品,所以我想使用它TypeToken。根据Guave TypeToken文档:
TypeLiteral.getFieldType(Field)
TypeToken
TypeToken与Guice的TypeLiteral类相似,但有一个重要的区别:它支持非修饰类型,例如T,List<T>甚至List<? extends Number>; 虽然TypeLiteral没有。TypeToken也是可序列化的,并提供了许多其他实用程序方法。
TypeLiteral
T
List<T>
List<? extends Number>
您可以使用来获得字段的化类型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()); } }
从我的头上,未经验证
Type t = B.class.getDeclaredField("b").getGenericType(); Class<?> p = TypeToken.of(t).resolve( /* T */ A.getTypeParameters()[0]).getRawType(); // p should be String.class