7

Guice を使用して汎用フィールドを特定の Java 型に変換する ASN.1 というファイル形式用のパーサーを作成したTypeLiteral.getFieldType(Field)ので、正しい型を構築できます (Jackson や GSON のデータバインディングに似ています)。しかし、私はすでに Guava に依存しており、新しい TypeLiteral の代替品があるように見えるので、代わりに使用したいと思いますTypeTokenGuave TypeTokenのドキュメントによると:

TypeTokenGuice のクラスに似ていますが、TypeLiteral重要な違いが 1 つあります。しません。また、シリアライズ可能であり、多数の追加のユーティリティ メソッドを提供します。TList<T>List<? extends Number>TypeLiteralTypeToken

を使用してフィールドの具体化された型を取得できますTypeTokenか? つまり、グアバで次のことを行うにはどうすればよいですか?

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

From my head, not verified

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 に答える