Kotlin反射与Java的互操作性
在编写同时适用于Java和Kotlin的反射代码时,开发人员应该注意哪些注意事项 例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释 以下是我注意到的一些差异 1。获取类实例Kotlin反射与Java的互操作性,java,reflection,metaprogramming,kotlin,Java,Reflection,Metaprogramming,Kotlin,在编写同时适用于Java和Kotlin的反射代码时,开发人员应该注意哪些注意事项 例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释 以下是我注意到的一些差异 1。获取类实例 // Example 1.1 - Java Class<?> userClass = User.class; // From a class name userClass = userInstance.g
// Example 1.1 - Java
Class<?> userClass = User.class; // From a class name
userClass = userInstance.getClass(); // OR from an instance
我无法像在Java中一样在Kotlin中使用.class
工具或.getClass()
方法
2。代表
当我在Kotlin类中使用委托属性时,我检索的属性具有$delegate
后缀。这与我们在Java中得到的字段有点相反(我知道Kotlin没有字段,只有属性)。这对元编程有何影响
然而,对于委托,我看到大多数方法都像在Java中一样保留其行为。我还需要注意其他的区别吗
要使Java和Kotlin对我来说具有互操作性,需要了解上面讨论的1,以及Kotlin给元编程带来的其他限制/差异
例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释
这可能是因为这些字段现在是私有的吗
无论如何,目前字段上的注释存在一些问题,这将在即将到来的里程碑中修复
其他一些相关问题:
javaClass()
的工作原理与C.class
完全相同,x.javaClass
的工作原理与x.getClass()的工作原理相同
在Kotlin类中使用委托属性时,检索的属性具有$delegate后缀
次要更正:字段具有$delegate
后缀,而不是属性
然而,对于委托,我看到大多数方法都像在Java中一样保留其行为。我还需要注意其他的区别吗
这些文档详细描述了如何实现委托属性
要使Java和Kotlin对我来说具有互操作性,需要了解上面讨论的1,以及Kotlin给元编程带来的其他限制/差异
Kotlin代码越像Java代码,从反射的角度看,差异就越小。如果您编写了惯用Kotlin,例如使用默认参数值、特征、属性、委托、顶级函数、扩展等,那么您得到的类与惯用Java不同,否则它们是紧密一致的。Andrey,1)库始终使用私有字段。2) 在Kotlin中,没有方法声明字段——那么为什么我在使用反射时会得到字段呢?没有在语言级别公开字段并不意味着类根本不存储任何数据。当Kotlin将属性编译为Java字节码时,它会创建一个字段+getter(可能还有setter)。#1不是问题,它只是有一个不同的名称来区分Java
类
对象和具有一些增强功能的增强Kotlin风格。
// Example 1.2 - Kotlin
val userClass = userInstance.javaClass // From an instance