2017-10-14 28 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)} 
    } 
}