开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11天,点击查看活动详情
Kclass代表类信息,Kparameter代表参数信息,而KCallable和Accessible一样代表的都是可调用的元素。 其分为两类,KFunction和KProperty,不同点是:
- KProperty中包含普通属性和可变属性KMutableProperty,且Kotlin中的属性包含Setter和Getter方法。。而java中的Field只代表这个字段,setget是在另外一个Method结构中
- KFunction统一了构造函数,包含Kproperty的Setter和Getter。而java中的Method还分为构造函数和普通函数,且是单独的setget方法不是Field自带的
- Java中反射需要设置可访问性,而Kotlin中的属性自带setget方法通过get可直接获取。也就是KProprity.call(对象实例)即可获取属性。
- Kotlin中获取信息比Java更明确直观。
Kotlin的增强
和java中的反射一样使用,不同的是Kotlin中由于多了很多特性所以其元数据类型也比java中多,比如:
metaclass描述类的类型kclass。 通过类名::class得到kclass
KClass中相比Java中的Class新增:
KCallable由于包含着KFunction和KProperty,所以先来看下KCallable中有哪些属性: KCallable可通过KClass的members成员获取,其返回值是Collection<KCallable<*>>
通过上面的信息已经可以获取到了类,属性和方法的信息,那么我们该如何获取参数信息呢? 参数信息又分为这三种:方法的参数信息,方法的返回值信息,泛型的参数信息(也就是参数类型)。 可通过KCallable.parameters获取方法的参数信息,返回值是List< KParameter >。
可看到通过Kparameter的type属性获取到参数的类型,那么返回值的类型和泛型类型该如何获取呢? 上面讲解KCallable的时候就已经有这两个属性了:
- 返回值类型:只有方法才有返回值,所以是通过KCallable的returntype属性可以获取到
- 参数类型:泛型一种是泛型方法还有一种是泛型类。泛型方法一样通过KCallable的typeParameters获取,在KClass中通过startProjectedType属性获取。返回值是List< KTypeParameter >不存在返回一个空的集合。
数据即是程序
这句话该怎么理解。我们倒推一下,通过一些信息来动态创建程序。 比如使用字节码工具ASM,javassist等动态生成类,还有使用KAPT注解处理器通过注解来手动输出程序到一个文件中。可以看到和Kotlin好像没有多大关系,所以Kotlin目前还没法做到动态创建程序。