Kotlin进阶实战
上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不会创建新的引用。