2017-10-14 99 views
1

我正在构建一个自动的swagger插件。在这里,我运行带注释的类。在Groovy中获取List的泛型类型

当我们谈论String,Long等的数据类型对我来说已经足够使用simpleName方法了。

但是,当获得一个List类,集合,集合我需要知道泛型类型。

那么我该如何做到这一点?

该做的大部分工作的代码示例:

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

由于Groovy是JVM上运行:https://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime – Opal

+0

这个问题几乎回答我的问题,但似乎是更多的新实例的运行时。我不想检查对象。 – Dasma

+0

泛型在运行时完全被擦除。不仅在对象上,而且在类上。 – Opal

回答

1

我找到了解决办法。我可以查看来自缓存字段的泛型类型。

见下面的例子:

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)} 
    } 
}