2012-11-20 14 views
6

Ho scritto un parser per un formato di file chiamato ASN.1 che utilizza Guice TypeLiteral.getFieldType(Field) per convertire campi generici in tipi specifici di Java in modo da poter creare il tipo corretto (simile al database di Jackson o GSON). Ma dato che sono già dipendente da Guava e sembra avere una nuova sostituzione di TypeLiteral, mi piacerebbe usare invece TypeToken. Secondo il Guave TypeToken documentation:Il tipoToken di Guava può ottenere il tipo specifico di un campo generico?

TypeToken è simile alla classe di Guice TypeLiteral, ma con una differenza importante: Supporta tipi non reificato come T, List<T> o addirittura List<? extends Number>; mentre lo TypeLiteral no. TypeToken è anche serializzabile e offre numerosi metodi di utilità aggiuntivi.

È possibile ottenere il tipo reificato di un campo utilizzando TypeToken? In altre parole, come posso fare quanto segue in 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()); 
    } 
} 

risposta

7

Dalla mia testa, non verificate

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

Grazie, getGenericType() e la determinazione() è quello che mi serviva. \t \t TypeToken reifiedA = TypeToken.of (B.class) .resolveType (B.class.getDeclaredField ("b"). GetGenericType()); \t \t assertEquals (String.class, reifiedA.resolveType (reifiedA.getRawType(). GetDeclaredField ("a"). GetGenericType()). GetRawType()); – yonran

+0

Questa risposta merita +50! Stavo cercando questo per 3 giorni e mi hai salvato la vita! –

+0

Sono felice di sentirlo :) –

Problemi correlati