2017-10-14 9 views
1

私は自動化されたswaggerプラグインを構築しています。ここでは、注釈付きクラスを実行します。Groovyのリストの汎用タイプを取得

String、Longなどのデータ型については、simpleNameメソッドを使用するだけで十分です。

しかし、List of Class、Set、Collectionに入るときは、ジェネリック型を知る必要があります。

どうすればいいですか?

仕事の大半を行うコードの例:

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

グルーヴィーは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)} 
    } 
} 
関連する問題