Kotlin 的 @JvmStatic 和 @JvmField 注解
这是关于 Java 静态方法和静态变量的一段代码:
public class TestStatic {
private int otherField = 0; public static final BigInteger BIG_INTEGER = BigInteger.ONE; public static void method() {
System.out.println("call method");
}
}
我们把它转换成 Kotlin 代码,会得到这样的结果:
class TestStatic {
private val otherField = 0 companion object {
val BIG_INTEGER = BigInteger.ONE fun method() {
println("call method")
}
}
}
静态方法和静态变量会被放在 companion object
当中,成为伴生方法和伴生常量。而这时候,会发现在 Java 中调用它们的方式会不一样,如下:
public static void main(String[] args) {
TestStatic.Companion.method();
BigInteger bigInteger = TestStatic.Companion.getBIG_INTEGER();
}
如果要使转换后的 Kotlin 代码在 Java 上调用起来和以前的习惯一样,则需要分别使用 @JvmStatic
和 @JvmField
注解,才能使它们暴露为静态方法或静态字段,如下:
object TestStatic {
@JvmField
val BIG_INTEGER = BigInteger.ONE @JvmStatic
fun method() {
println("call method")
}
}
这样 Java 对 Kotlin 的调用习惯就和以前一样了:
public static void main(String[] args) {
TestStatic.method();
BigInteger bigInteger = TestStatic.BIG_INTEGER;
}
关于这一点,在《Android Kotlin 指南》的文档中有提到,分别如下:
伴生函数:
在 “companion object” 中的公共函数必须用使用 @JvmStatic
注解才能暴露为静态方法。
如果没有这个注解,这些函数仅可用作静态 Companion 字段上的实例方法。
伴生常量:
在 companion object 中的公共、非 const 的属性 实际上为常量 必须用 @JvmField 注解才能暴露为静态字段。
如果没有这个注解,这些属性只能作为静态 Companion 字段中奇怪命名的 ‘getters’ 实例。而只使用 @JvmStatic 而不是 @JvmField 的话,会将奇怪命名的 ‘getters’ 移到类的静态方法中,但仍然是不正确的。
Kotlin 的 @JvmStatic 和 @JvmField 注解的更多相关文章
- kotlin学习(9)注解
我们一般使用类和函数要说明类和函数的确切名称.调用一个类,你需要知道它定义在哪个类中,还有它的名称和参数的类型. 注解和反射可以给你超越这个规则的能力,让你编写出使用事先未知的任意类的代码.注解赋予这 ...
- 【从零开始撸一个App】Kotlin
工欲善其事必先利其器.像我们从零开始撸一个App的话,选择最合适的语言是首要任务.如果你跟我一样对Java蹒跚的步态和僵硬的语法颇感无奈,那么Kotlin在很大程度上不会令你失望.虽然为了符合JVM规 ...
- kotlin spring @value 注解
spring boot和kotlin里静态类使用@Value注解配置解决方案前言spring boot里默认是不能给静态属性使用@Value赋值的.所以这里使用中间变量过渡绑定. 方案//applic ...
- Kotlin异常与Java异常的区别及注解详解
Kotlin异常与Java异常的区别: throw的Kotlin中是个表达式,这样我们可以将throw作为Elvis表达式[val test = aa ?: bb,这样的则为Elvis表达式,表示如果 ...
- Kotlin基础学习
Kotlin 和 java 都是一种静态类型的编程语言.表达式的类型在编译期已经确定,编译期能验证对象是否包含想访问方法或是字段,维护正确性与性能的同时保持源代码的简洁 静态类型的 ...
- Kotlin字节码生成机制详尽分析
通过注解修改Kotlin的class文件名: 对于Kotlin文件在编译之后生成的class文件名默认是有一定规则的,比如: 而其实这个生成字节码的文件名称是可以被改的,之前https://www.c ...
- 简单几招提速 Kotlin Kapt编译
https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_ ...
- List/Map 导出到表格(使用注解和反射)
Java 的 POI 库可以用来创建和操作 Excel 表格,有时候我们只需要简单地将 List 或 Map 导出到表格,样板代码比较多,不够优雅.如果能像 Gson 那样,使用注解标记要导出的属性, ...
- Java调用Kotlin事项及Kotlin反射初步
继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...
随机推荐
- 如何在当前目录下打开Windows cmd?
在当前目录下,按Alt + D (全选当前目录),然后输入 cmd 再按回车 Enter .
- JS 深拷贝/合并
var mix = function(r, s, ov) { if (!s || !r) return r; if (ov === undefined) ov = true; for (var p i ...
- 第二章 Vue快速入门-- 26 过滤器-定义私有过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- java 枚举的用法
public enum StatisticTableEnum { DOC_BROWSE_STATISTIC("doc_browse_statistic"), DOC_LIB_BRO ...
- linux NFS配置案例
1.查看NFS软件包 [root@server7 ~]# rpm -qa | egrep "nfs|rpcbind" 2.安装NFS和RPC服务 [ro ...
- params修饰符的用法
params修饰符是用来声明参数数组允许向方法传递数量不定的自变量用的.事实上System.Console 类的 Write 和 WriteLine 方法是参数数组用法的典型示例.他们的声明方式如下: ...
- 微信小程序let和var以及const有什么区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. for(var i=0;i&l ...
- “==”与equals方法
“==”操作符 基本类型比较值:判断两个变量的值相等. 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时才相等. 用“==”进行比较时,两边的数据类型必须兼容(可自动转换的基本数据类型除外 ...
- Confluence 6 图片文件
当你对一个页面进行编辑的时候,选择一个图片,将会显示图片属性面板.这个面板允许你设置显示大小,添加边控和特效和链接这个图片到其他页面. 从图片的属性面板,你可以: 为以图片选择一个 显示大小(pres ...
- html密码框value为空,但是总有默认密码(原)
input输入框加属性:autocomplete="new-password" ,浏览器就不会给他填充默认密码. <input class="form-contro ...