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


TypeToken与Guice的TypeLiteral类相似,但有一个重要的区别:它支持未修饰的类型,例如TList<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());
    }
}

最佳答案

从我的头上,未经验证

Type t = B.class.getDeclaredField("b").getGenericType();
Class<?> p = TypeToken.of(t).resolve(
        /* T */  A.getTypeParameters()[0]).getRawType();
// p should be String.class

07-26 02:25