2017-10-14 5 views
1

Je construis un plugin swagger automatisé. Ici, je cours à travers des classes annotées.Obtenez le type générique d'une liste dans Groovy

Lorsque nous parlons des types de données de String, Long, etc. est suffisant pour moi utiliser la méthode simpleName.

Mais quand j'arrive à une classe de liste, définir, collection j'ai besoin de connaître le type générique.

Alors, comment puis-je faire cela?

Un exemple de code qui fait la plupart du travail:

class Foo { 
    List<String> myString 
} 

class SomeUtilClass { 
    static String dataType(Class<?> c) { 
     return c.simpleName 
    } 
    static List<String> dataTypes(Class<?> c) { 
     return c.metaClass.properties.findAll {MetaProperty metaProperty -> 
      metaProperty?.field != null 
     }.collect {dataType(it.type)} 

    } 
} 

SomeUtilClass.dataTypes(Foo) // ["List"] but I want something like ["List<String>"] 
+1

Depuis groovy est exécuté sur la JVM: https://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime – Opal

+0

cette question presque répondre à ma question, mais semble être plus l'exécution de nouvelles instances. Je ne veux pas vérifier l'objet. – Dasma

+0

Les génériques sont effacés lors de l'exécution. Pas seulement sur les objets mais aussi sur les classes. – Opal

Répondre

1

J'ai trouvé la solution. Je peux regarder le type générique des champs mis en cache.

Voir exemple ci-dessous:

class SomeUtilClass { 
    static String dataType(Class<?> c) { 
     return c.simpleName 
    } 
    static List<String> dataTypes(Class<?> c) { 
     return c.metaClass.properties.findAll {MetaProperty metaProperty -> 
      metaProperty?.field != null 
     }.collect {findGenerics(it.type)} 

    } 
    static void findGenerics(CachedField t) { 
     t.field.genericType?.actualTypeArguments.collect {dataType(it)} 
    } 
}