自定義註解獲取類,屬性變量,方法,方法參數上註解的值(Kotlin)

先看下效果
在這裏插入圖片描述
我們先來看一下kotlin中的註解Annotation.kt:


package kotlin.annotation

import kotlin.annotation.AnnotationTarget.*

public enum class AnnotationTarget {
    /** 類、接口或對象 */
    CLASS,
    /** 僅註釋類 */
    ANNOTATION_CLASS,
    /** 泛型類型參數(尚不支持)*/
    TYPE_PARAMETER,
    /** Property */
    PROPERTY,
    /** 屬性變量 */
    FIELD,
    /** 局部變量*/
    LOCAL_VARIABLE,
    /** 函數或構造函數的參數 */
    VALUE_PARAMETER,
    /** 僅構造函數 */
    CONSTRUCTOR,
    /** 函數(不包括構造函數) */
    FUNCTION,
    /** 僅屬性getter */
    PROPERTY_GETTER,
    /** 僅屬性setter */
    PROPERTY_SETTER,
    /** Type usage */
    TYPE,
    /** Any expression */
    EXPRESSION,
    /** 文件 */
    FILE,
    /** Type alias */
    @SinceKotlin("1.1")
    TYPEALIAS
}


public enum class AnnotationRetention {
    /** 在源文件中有效(即源文件保留) */
    SOURCE,
    /** 註釋存儲在二進制輸出中,但對反射不可見 */
    BINARY,
    /** 在運行時有效(即運行時保留)*/
    RUNTIME
}

@Target(AnnotationTarget.ANNOTATION_CLASS)
@MustBeDocumented
public annotation class Target(vararg val allowedTargets: AnnotationTarget)

@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class Retention(val value: AnnotationRetention = AnnotationRetention.RUNTIME)

@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class Repeatable

@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class MustBeDocumented

使用方法:
創建file:KTAnnotation.kt (所有都寫到一個kt文件中,方便測試和使用),

完整代碼如下所示,簡單易用

package com.i.mvvmdemo

//-------------------------------定義註解---------------------------------------
@Target(
    //類註解
    AnnotationTarget.CLASS,
    //屬性變量註解
    AnnotationTarget.FIELD,
    //函數方法註解
    AnnotationTarget.FUNCTION,
    //方法參數註解
    AnnotationTarget.VALUE_PARAMETER
)
@Retention(AnnotationRetention.RUNTIME)
annotation class RequestParam(val name: String, val value: String)

//-------------------------------使用註解---------------------------------------

@RequestParam(name = "nnn", value = "vvv")
class UserRequest {
    @RequestParam(name = "小明", value = "男生")
    private var age = 18

    @RequestParam(name = "張飛", value = "大口吃飯")
    private fun eat(
        @RequestParam(name = "吃什麼?", value = "白米飯") food: String,
        @RequestParam(name = "喝什麼?", value = "水") drink: String
    ) {

    }

}

//-------------------------------獲取註解的值---------------------------------------

//獲取類上面的註解
fun getClassAnnotaion() {
    val clazz = UserRequest::class.java
    val annotation = clazz.getAnnotation(RequestParam::class.java)
    println("類註解的值:${annotation?.name},${annotation?.value}")
}

//獲取屬性變量上面的註解
fun getFieldAnnotaion() {
    val clazz = UserRequest::class.java
    val annotations = clazz.declaredFields
    for (i in annotations) {
        val annotation = i.getAnnotation(RequestParam::class.java)
        println("屬性變量註解的值:${annotation?.name},${annotation?.value}")
    }
}

//獲取函數上面的註解
fun getFunctionAnnotaion() {
    val clazz = UserRequest::class.java
    val annotations = clazz.declaredMethods
    for (i in annotations) {
        val annotation = i.getAnnotation(RequestParam::class.java)
        println("函數註解的值:${annotation?.name},${annotation?.value}")
    }
}

//獲取方法參數上註解的值
fun getParameterAnnotaion() {
    val clazz = UserRequest::class.java
    val method = clazz.getDeclaredMethod("eat", String::class.java, String::class.java)
    val parameterAnnotations = method.parameterAnnotations
    for (iss in parameterAnnotations) {
        for (i in iss) {
            if (i is RequestParam) {
                println("參數註解的值:${i?.name},${i?.value}")
            }
        }
    }
}

//-------------------------------測試---------------------------------------

fun main() {
    getClassAnnotaion()
    getFieldAnnotaion()
    getFunctionAnnotaion()
    getParameterAnnotaion()
}
Java的註解使用方式參照:https://www.jianshu.com/p/13991ec28dd3

獲取方法參數註解的值,不指定方法名:

//獲取方法參數上註解的值,不指定具體方法
fun getParameterAnnotaion2() {
    val clazz = UserRequest::class.java
    for (method in clazz.declaredMethods) {
        val parameterAnnotations = method.parameterAnnotations
        for (iss in parameterAnnotations) {
            for (i in iss) {
                print("方法名:${method.name}")
                if (i is RequestParam) {
                    println("參數註解的值:${i?.name},${i?.value}")
                }
            }
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章