Kotlin与Java的反射互操作性

在编写与Java和Kotlin兼容的反射代码时,开发人员应该注意哪些警告?

例如,我有一个使用反射的现有库,它与Java很好地协作。 但是,当我用Kotlin的时候,我的反射代码似乎没有拿起字段上的注释。

以下是我注意到的一些差异。

1.获取一个类的实例

// 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 

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

2.代表

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

但是,对于代表,我发现大多数方法像在Java中一样保持其行为。 我还有什么其他的不同吗?

要使Java和Kotlin能够互操作,需要了解上面讨论的1以及Kotlin带给元编程的其他限制/差异。

例如,我有一个使用反射的现有库,它与Java很好地协作。 但是,当我用Kotlin的时候,我的反射代码似乎没有拿起字段上的注释。

难道是因为田地现在是私人的吗?

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

其他一些相关问题:

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

只有语法是不同的: javaClass<C>()x.javaClass完全一样, C.classx.getClass()

当我在Kotlin类中使用委托属性时,我检索的属性具有$委托后缀。

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

但是,对于代表,我发现大多数方法像在Java中一样保持其行为。 我还有什么其他的不同吗?

这里的文档给你一个关于委托属性如何实现的详细描述。

要使Java和Kotlin能够互操作,需要了解上面讨论的1以及Kotlin带给元编程的其他限制/差异。

您的Kotlin代码与Java代码相似的程度越高,与反射角度的差异就越小。 如果你写的是惯用的Kotlin,例如使用默认的参数值,特性,属性,委托,顶层函数,扩展等等,你得到的类与惯用的Java不同,否则它们是紧密对齐的。