在编写适用于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为元编程带来的其他限制/差异。
答案 0 :(得分:5)
例如,我有一个使用反射的现有库,它适用于Java。但是,当我在Kotlin中使用相同的代码时,我的反射代码似乎没有在字段上获取注释。
可以因为这些字段现在是私有的吗?
无论如何,目前在字段上存在注释问题,这将在即将到来的里程碑中得到修复。
其他一些相关问题:
我无法像在Java中那样在Kotlin中使用.class工具或.getClass()方法。
只有语法不同:javaClass<C>()
与C.class
完全相同,x.javaClass
与x.getClass()
完全相同
当我在Kotlin类中使用委托属性时,我检索的属性具有$ delegate后缀。
次要更正:字段具有$delegate
后缀,而不是属性。
然而,对于代理人,我发现大多数方法都保留了他们的行为,就像在Java中一样。我还必须注意其他差异吗?
文档here为您提供了如何实施委托属性的详细说明。
让Java和Kotlin可以互操作,需要理解上面讨论的1,以及Kotlin为元编程带来的其他限制/差异。
你的Kotlin代码越像Java代码,与反射观点的差异就越小。如果你写惯用的Kotlin,例如使用默认参数值,特征,属性,委托,顶级函数,扩展等,您获得的类与惯用Java不同,否则它们是紧密对齐的。