Kotlin反射与Java的互操作性

在编写适用于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不同,否则它们是紧密对齐的.

上一篇:如何驱动C#,C或Java编译器在编译时计算1 2 3 … 1000?


下一篇:Win8.1+vs2012+osg环境搭建