Rag*_*har 3 java reflection metaprogramming kotlin
在编写适用于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
Run Code Online (Sandbox Code Playgroud)
在Kotlin中获取Java类实例
// Example 1.2 - Kotlin
val userClass = userInstance.javaClass // From an instance
Run Code Online (Sandbox Code Playgroud)
我不能像在Java中那样使用Kotlin中的.class工具或.getClass()方法.
2.代表们
当我在Kotlin类中使用委托属性时,我检索的属性具有$delegate后缀.这与我们在Java中获得的字段有点相反(我知道Kotlin没有字段,只有属性).这对元编程有何影响?
但是,对于委托,我发现大多数方法都像Java一样保留了它们的行为.我还需要注意其他差异吗?
让Java和Kotlin可以与我互操作需要理解上面讨论的1,以及Kotlin为元编程带来的其他限制/差异.
例如,我有一个使用反射的现有库,它适用于Java.但是,当我在Kotlin中使用相同的代码时,我的反射代码似乎没有在字段上获取注释.
可能因为这些字段现在是私有的吗?
无论如何,目前在字段上存在注释问题,这将在即将到来的里程碑中得到修复.
其他一些相关问题:
我不能像在Java中那样在Kotlin中使用.class工具或.getClass()方法.
只有语法不同:javaClass<C>()工作方式完全相同C.class,并且x.javaClass做同样的事情x.getClass()
当我在Kotlin类中使用委托属性时,我检索的属性具有$ delegate后缀.
小修正:字段具有$delegate后缀,而不是属性.
但是,对于委托,我发现大多数方法都像Java一样保留了它们的行为.我还需要注意其他差异吗?
这里的文档为您提供了如何实现委派属性的详细说明.
让Java和Kotlin可以与我互操作需要理解上面讨论的1,以及Kotlin为元编程带来的其他限制/差异.
你的Kotlin代码越像Java代码,与反射观点的差异就越小.如果您编写惯用的Kotlin,例如使用默认参数值,特征,属性,委托,顶级函数,扩展等,您获得的类与惯用Java不同,否则它们是紧密对齐的.