【问题标题】:Kotlin reflection interoperability with JavaKotlin 反射与 Java 的互操作性
【发布时间】:2015-03-27 06:38:34
【问题描述】:

开发人员在编写适用于 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 给元编程带来的其他限制/差异。

【问题讨论】:

  • #1 不是问题,它只是有一个不同的名称来区分 Java Class 对象和具有一些增强功能的增强 Kotlin 风格 KClass

标签: java reflection metaprogramming kotlin


【解决方案1】:

例如,我有一个使用反射的现有库,它适用于 Java。但是,当我在 Kotlin 中使用相同的代码时,我的反射代码似乎没有提取字段上的注释。

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

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

其他一些相关问题:

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

只有语法不同:javaClass&lt;C&gt;()C.class 完全相同,x.javaClassx.getClass() 完全相同

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

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

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

文档here 详细描述了委托属性是如何实现的。

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

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

【讨论】:

  • Andrey,1) 图书馆一直使用私有字段。 2)在 Kotlin 中,没有办法声明字段——那为什么我在使用反射时会得到字段?
  • 未在语言级别公开的字段并不意味着类根本不存储任何数据。当 Kotlin 将属性编译为 Java 字节码时,它会创建一个字段 + getter(可能还有 setter)。
猜你喜欢
  • 2021-12-30
  • 2020-06-21
  • 2018-06-18
  • 2010-11-12
  • 2014-05-10
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多