Kotlin反射与Java的互操作性

3
开发者在编写适用于Java和Kotlin的反射代码时需要注意哪些问题?
例如,我有一个使用反射的现有库,它可以与Java很好地配合使用。然而,当我将其与Kotlin一起使用时,我的反射代码似乎无法拾取字段上的注释。
以下是我注意到的一些差异。
1. 获取Class实例
// Example 1.1 - Java
Class<?> userClass = User.class;         // From a class name
userClass = userInstance.getClass();     // OR from an instance

在Kotlin中获取Java类实例

// Example 1.2 - Kotlin
val userClass = userInstance.javaClass   // From an instance

在Kotlin中,我无法像在Java中使用.class功能或.getClass()方法。

2. 代理

当我在Kotlin类中使用委托属性时,我检索到的属性具有$delegate后缀。这与我们在Java中获得的字段有些相反(我确实了解Kotlin没有字段,只有属性)。这会影响元编程吗?

但是,使用代理时,我发现大多数方法保留其在Java中的行为。还有其他我需要注意的差异吗?

对我来说,使Java和Kotlin互操作需要了解上述1讨论的内容,以及Kotlin带来的元编程限制/差异。


#1 不是问题,它只是有一个不同的名称来区分Java的Class对象和具有增强功能的Kotlin口味KClass - Jayson Minard
1个回答

5
例如,我有一个使用反射的现有库,它在Java中运行良好。但是,当我在Kotlin中使用相同的库时,我的反射代码似乎无法捕获字段上的注释。
可能是因为这些字段现在是私有的吗?
无论如何,目前存在有关字段注释的问题,这将在即将到来的里程碑版本中修复。
其他相关问题: 我无法像在Java中那样使用Kotlin的.class设施或.getClass()方法。只有语法不同:javaClass<C>()C.class完全相同,x.javaClassx.getClass()执行相同的操作。
当我在Kotlin类中使用委托属性时,我检索到的属性具有$delegate后缀,这里需要进行小修正:字段具有$delegate后缀,而不是属性。
然而,使用委托时,我看到大多数方法保留了它们在Java中的行为。还有其他差异需要注意吗?
文档here为您提供了关于如何实现委托属性的详细说明。
对我来说,使Java和Kotlin互操作需要理解上述1点以及Kotlin带来的元编程的其他限制/差异。

如果你的Kotlin代码越像Java代码,那么从反射的角度来看它们之间的差异就会越小。如果你编写符合惯用法的Kotlin代码,例如使用默认参数值、特征、属性、委托、顶层函数、扩展等,那么你得到的类与惯用Java的类不同,否则它们非常相似。


Andrey,1)该库始终使用私有字段。2)在Kotlin中,没有声明字段的方法 - 那么为什么我在使用反射时会得到字段? - Ragunath Jawahar
字段在语言级别上未公开并不意味着类根本不存储任何数据。当Kotlin将属性编译为Java字节码时,它会创建一个字段+getter(和可能的setter)。 - Andrey Breslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接