
上QQ阅读APP看书,第一时间看更新
7.3 Java反射和Kotlin反射(上)
7.3.1 类引用,获取Class对象
1.Java获取Class对象的方式
· Class.forName("完整的包名+类名"):
Class<?> clazz = Class.forName("xxx.xxx.MyClass")
· 类名.class:
Class<?> clazz = MyClass.class;
· 实例对象.getClass():
MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
2.Kotlin获取Class对象的方式
· 调用的类是Java类,需要添加.java后缀(KClass的扩展属性java):
val clazz = MyClass::class.java
· 添加Java实例对象的.javaClass后缀(Java实例对象的扩展属性javaClass):
val obj = MyClass() val clazz = obj.javaClass
· 调用的类是Kotlin类:
val clazz = MyClass::class
此时clazz的类型是KClass,KClass的一个实例表示对Kotlin类的引用。KClass也是Kotlin反射API的主要入口。
在Kotlin中,字节码对应的类也是kotlin.reflect.KClass。
Kotlin引用类有两种方式:类名::class和对象::class,它们获取的是相同的KClass实例。
即处于同一个类加载器中,给定的类型只能返回一个KClass实例。即使多次尝试实例化KClass,仍然只能获取同一对象的引用,Kotlin不会创建新的引用。