在编写适用于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为元编程带来的其他限制/差异.
解决方法:
For example, I have an existing library that uses reflection and it works well with Java. However, when I use the same with Kotlin, my reflective code doesn’t seem to pick up the annotations on fields.
可能因为这些字段现在是私有的吗?
无论如何,目前在字段上存在注释问题,这将在即将到来的里程碑中得到修复.
其他一些相关问题:
> https://youtrack.jetbrains.com/issue/KT-5967
> https://youtrack.jetbrains.com/issue/KT-4169
> https://youtrack.jetbrains.com/issue/KT-3625
I’m unable to use the .class facility or the .getClass() method in Kotlin as we do in Java.
只有语法不同:javaClass< C>()与C.class完全相同,x.javaClass与x.getClass()完全相同
When I use delegated properties in a Kotlin class, the properties that I retrieve have the $delegate suffix.
次要更正:字段具有$delegate后缀,而不是属性.
However, with delegates I see that most of the methods retain their behavior as they do in Java. Are there any other differences that I have to be aware of?
文档here为您提供了如何实现委派属性的详细说明.
Making Java and Kotlin interoperable for me would require understanding about 1 discussed above, plus other limitations / differences that Kotlin brings to meta-programming.
你的Kotlin代码越像Java代码,与反射观点的差异就越小.如果你写惯用的Kotlin,例如使用默认参数值,特征,属性,委托,*函数,扩展等,您获得的类与惯用Java不同,否则它们是紧密对齐的.