Kotlin反射与Java的互操作性

拉古纳·贾瓦哈(Ragunath Jawahar)

开发人员在编写适用于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

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

2.代表们

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

但是,在委托中,我看到大多数方法都像在Java中一样保留其行为。我还有其他需要注意的区别吗?

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

安德烈·布雷斯拉夫(Andrey Breslav)

例如,我有一个使用反射的现有库,它与Java很好地兼容。但是,当我在Kotlin上使用相同的代码时,我的反射代码似乎没有拾取字段上的注释。

可能是因为这些字段现在是私有的吗?

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

其他一些相关问题:

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

只是语法不同:与的功能javaClass<C>()完全相同C.class,并且x.javaClass与的功能相同x.getClass()

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

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

但是,在委托中,我看到大多数方法都像在Java中一样保留其行为。我还有其他需要注意的区别吗?

此处的文档为您详细介绍了如何实现委托属性。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章