Kotlin 反射与 Java 的互操作性

Kotlin reflection interoperability with Java

开发人员在编写同时适用于 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 class 实例

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

我无法像在 Java 中那样使用 Kotlin 中的 .class 工具或 .getClass() 方法。

2。代表

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

但是,对于委托,我发现大多数方法都保留了它们在 Java 中的行为。还有其他我必须注意的区别吗?

让 Java 和 Kotlin 对我来说可互操作需要了解上面讨论的 1,以及 Kotlin 给元编程带来的其他限制/差异。

For example, I have an existing library that uses reflection and it works well with Java. However, when I use the same with Kotlin, my reflective code doesn't seem to pick up the annotations on fields.

难道是因为字段现在是私有的?

无论如何,目前字段上的注释存在问题,这将在即将到来的里程碑中得到解决。

其他一些相关问题:

I'm unable to use the .class facility or the .getClass() method in Kotlin as we do in Java.

只是语法不同:javaClass<C>()C.class 完全相同,x.javaClassx.getClass()

完全相同

When I use delegated properties in a Kotlin class, the properties that I retrieve have the $delegate suffix.

小更正:字段$delegate后缀,而不是属性。

However, with delegates I see that most of the methods retain their behavior as they do in Java. Are there any other differences that I have to be aware of?

文档 here 详细描述了委托属性的实现方式。

Making Java and Kotlin interoperable for me would require understanding about 1 discussed above, plus other limitations / differences that Kotlin brings to meta-programming.

您的 Kotlin 代码越像 Java 代码,从反射的角度来看差异就越小。如果您编写惯用的 Kotlin,例如使用默认参数值、特征、属性、委托、顶级函数、扩展等,你得到的 类 不同于惯用的 Java,否则它们是紧密对齐的。