Kotlin反射与Java的互操作性

Kotlin反射与Java的互操作性,java,reflection,metaprogramming,kotlin,Java,Reflection,Metaprogramming,Kotlin,在编写同时适用于Java和Kotlin的反射代码时,开发人员应该注意哪些注意事项 例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释 以下是我注意到的一些差异 1。获取类实例 // Example 1.1 - Java Class<?> userClass = User.class; // From a class name userClass = userInstance.g

在编写同时适用于Java和Kotlin的反射代码时,开发人员应该注意哪些注意事项

例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释

以下是我注意到的一些差异

1。获取类实例

// Example 1.1 - Java
Class<?> userClass = User.class;         // From a class name
userClass = userInstance.getClass();     // OR from an instance
我无法像在Java中一样在Kotlin中使用
.class
工具或
.getClass()
方法

2。代表

当我在Kotlin类中使用委托属性时,我检索的属性具有
$delegate
后缀。这与我们在Java中得到的字段有点相反(我知道Kotlin没有字段,只有属性)。这对元编程有何影响

然而,对于委托,我看到大多数方法都像在Java中一样保留其行为。我还需要注意其他的区别吗

要使Java和Kotlin对我来说具有互操作性,需要了解上面讨论的1,以及Kotlin给元编程带来的其他限制/差异

例如,我有一个使用反射的现有库,它可以很好地与Java配合使用。然而,当我对Kotlin使用相同的方法时,我的反射代码似乎没有拾取字段上的注释

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

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

其他一些相关问题:

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

只是语法不同:
javaClass()
的工作原理与
C.class
完全相同,
x.javaClass
的工作原理与
x.getClass()的工作原理相同

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

次要更正:字段具有
$delegate
后缀,而不是属性

然而,对于委托,我看到大多数方法都像在Java中一样保留其行为。我还需要注意其他的区别吗

这些文档详细描述了如何实现委托属性

要使Java和Kotlin对我来说具有互操作性,需要了解上面讨论的1,以及Kotlin给元编程带来的其他限制/差异


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

Andrey,1)库始终使用私有字段。2) 在Kotlin中,没有方法声明字段——那么为什么我在使用反射时会得到字段呢?没有在语言级别公开字段并不意味着类根本不存储任何数据。当Kotlin将属性编译为Java字节码时,它会创建一个字段+getter(可能还有setter)。#1不是问题,它只是有一个不同的名称来区分Java
对象和具有一些增强功能的增强Kotlin风格。
// Example 1.2 - Kotlin
val userClass = userInstance.javaClass   // From an instance