やることはタイトルの通りです。
パラメータに付与するアノテーションを作る
実際のコードは以下の通りです。
Target
はVALUE_PARAMETER
を指定します.
アノテーションクラス
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
annotation class Hoge(val value: String)
付与する場合以下のようになります。
コンストラクタに対して付与する場合、param
を頭に付ける必要があります。
コンストラクタのパラメータに付与する例
data class Fuga(@param:Hoge("value") val fuga: String)
付与したアノテーションを取得する
先ほどのFuga
クラスのコンストラクタのパラメータから付与したアノテーションを取得するコードは以下の通りです。
// Hogeのクラスからコンストラクタを取得
val kClazz: KClass<Fuga> = Fuga::class
val constructor: KFunction<Fuga> = kClazz.primaryConstructor!!
// コンストラクタのパラメータからHogeを取り出し
val parameters: List<KParameter> = constructor.parameters
val annotated: List<Hoge> = parameters
.mapNotNull { param ->
// Contractは効かないのでHogeとして取り出す場合はキャストが必要
param.annotations.find { it is Hoge }?.let { it as Hoge }
}
// 当然値も取り出せる
val values = annotated.map{ it.value }