Kotlin反射与Java的互操作性

时间:2015-01-28 11:20:52

标签: java reflection metaprogramming kotlin

在编写适用于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 个答案:

答案 0 :(得分: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不同,否则它们是紧密对齐的。