/**
* 反射:自动完成某些功能
* 类名、构造函数、属性、函数/返回值 名称 参数
* 类 类对象Person::class
*/
class User(val name:String, val age:Int){
constructor():this("Jack",20)
private val password:String =""
fun show(){
println("$name $age $password")
}
}
fun main() {
inner()
}
/**
* KFunction:KCallable
* name,parameters,typeParameters,returnType,isFinal,isOpen
*
*/
fun inner(){
//获取某个类的类对象Class -> KClass
val cls:KClass = User::class
//创建User对象
//1.如果这个类的内部有无参构造函数
//可以使用一个方法
val obj = cls.createInstance()
//类的信息
//获取所有的构造函数
cls.constructors.forEach {
(print(it.name))
it.parameters.forEach {pit->
print("${pit.index} ${pit.name}")
}
println()
}
//只获取主构造函数
val prmConstr = cls.primaryConstructor
val obj2 = prmConstr?.call("Mary",20)
obj2?.show()
//判断这个类是否是抽象类
cls.isAbstract
//全类名 完整的路径名称
println(cls.qualifiedName)
println(cls.simpleName)
//类名
println(cls.jvmName)
//获取自己和父类的所有属性
cls.memberProperties.forEach{
print("${it.name}")
}
println()
//只获取自己的属性
cls.declaredMemberProperties.forEach {
print("${it.name}")
println()
}
//获取所有的函数
cls.functions.forEach {
print("${it.name}")
}
//获取自己声明的函数
val functions = cls.declaredMemberFunctions as List
//如何调用一个函数
//u.show()
functions[0].call(obj2)
}
**
* 注解Annotation
*注:标注 解:解释
* 没有实际意义,不会影响代码运行
* 可以修饰类,属性,函数,文件
*/
//注解的生命周期
@Retention(AnnotationRetention.RUNTIME)
//作用域
@Target(AnnotationTarget.CLASS)
annotation class Database(val tableName:KClass)
@Database(User::class)
class AppDatabase(){
val v2:String =""
fun t(){
}
}
fun main() {
val cls = AppDatabase::class
cls.annotations.forEach {
val annotationName =it.annotationClass.simpleName
if (annotationName =="Entity") {
}
}
}