注解与反射的使用
程序员文章站
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)"
}
}