欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

注解与反射的使用

程序员文章站 2024-01-25 20:11:28
...
class MyAnnotation {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {   //main函数
            checkField(UserBean("pjxx",111))
        }
        fun checkField(bean:UserBean){
        //通过反射得到Class对象
        //方式一: val cls=Class.forName("com.example.tab1.UserBean") 
        //方式二:
            val cls=UserBean::class.java
            cls.declaredFields.forEach {
                it.isAccessible=true		//强制获得类中私有属性(字段)和方法等
                if (it.isAnnotationPresent(Pjx::class.java)) {	//判断该属性是否有注解标记
                    val value=it.get(bean)		//得到属性的值
                    val pjx=it.getAnnotation(Pjx::class.java)		//得到注解对象
                    if (value is String) {		//判断值的类型:这里可以给注解多加一个参数来限制不同的属性
                        if (value.length > pjx.length) {		//限制值的长度,pjx.length就是增加注解里面的值
                            println("名字不能大于三位数")
                            return
                        }
                    }else if (value is Int){
                        if (value > pjx.length) {
                            println("年龄不能大于110")
                            return
                        }
                    }
                }
            }
            println(bean.toString())
        }
    }
}

/**自定义的注解:用来限制bean中字段的长度*/
@Target(AnnotationTarget.FIELD)		//作用域:用在在那上面
@Retention()
annotation class Pjx(val length:Int){

}

/**bean类*/
class UserBean(@Pjx(length = 3)var name:String="",@Pjx(length = 110)var age:Int=0){
    override fun toString(): String {
        return "UserBean(name='$name', age=$age)"
    }
}