LoginSignup
1
1

More than 3 years have passed since last update.

【Kotlin】関数の引数に付与するアノテーションを作る/付与したアノテーションを取得する

Last updated at Posted at 2019-12-05

やることはタイトルの通りです。

パラメータに付与するアノテーションを作る

実際のコードは以下の通りです。
TargetVALUE_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 }
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1