【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

这篇具有很好参考价值的文章主要介绍了【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





一、Kotlin 变量可空性




1、Java 与 Kotlin 空值处理区别


在 Java 语言 中 , 任何 引用类型变量 都可以为 空 null ; Java 中 八种 基本数据类型 变量 的 默认值 为 0 或 false ;

但是在 Kotlin 语言 中 , 所有的 变量 都是引用类型变量 , 没有基本数据类型 , 默认情况下 所有的变量 都为 非空类型 ;


下面分别定义一个 Java 类Kotlin 脚本 , 在 Kotlin 脚本调用调用 Java 类的成员 ;


2、Java 函数返回非空值和控制


代码示例 : 定义一个 Java 函数 , 分别返回 非空字符串 和 空值 ;

public class JavaMethod {
	// 返回非空字符串
    public String getName() {
        return "Tom";
    }

	// 返回 null
    public String getNullName() {
        return null;
    }
}

3、Kotlin 函数调用 Java 函数


在 Kotlin 中 调用上述类中的两个函数 , 是不会报错的 ;

但是 , 如果调用 空值 的 成员 , 则直接报 空指针异常 ;


代码示例 :

fun main() {
    val javaMethod = JavaMethod()

    // 打印两个返回值
    println(javaMethod.getName())
    println(javaMethod.getNullName())

    // 如果调用空值的成员, 则会报错
    javaMethod.getNullName().length
}

执行结果 :

Tom
null
Exception in thread "main" java.lang.NullPointerException
	at HelloKt.main(Hello.kt:9)
	at HelloKt.main(Hello.kt)

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


4、平台类型


在 Kotlin 中 , 凡是 调用 Java 代码 获取的 变量 , 不知道 这个变量 是否为空 , 这种变量的类型 就称为 " 平台类型 " ;

所有的 平台类型 变量 都是 可空的 , Kotlin 会将其自动推断为 可空类型 ;

调用 平台类型 变量 的成员时 , 都必须使用 " ?. " 操作符 进行访问 ;


如下图所示 : 调用 JavaMethod.java 类中的 函数 , 获取的变量 , 被 自动推断为 String? 类型 ;

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


代码示例 :

fun main() {
    val javaMethod = JavaMethod()

    // 打印两个返回值
    println(javaMethod.getName())
    println(javaMethod.getNullName())

    // 调用 Java 函数获取的 平台类型 变量
    val name = javaMethod.getNullName()
    println(name?.length)
}

执行结果 :

Tom
null
null

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


5、@NotNull 和 @Nullable 注解


在 Java 中 , 一般使用 @NotNull@Nullable 注解 标记

  • 方法参数
  • 方法返回值
  • 成员字段

是否可以为空 ;

  • 如果使用 @NotNull 注解 修饰 成员属性 或 成员函数 , 则表示 函数返回值 或 成员 不允许为空 ;
  • 如果使用 @Nullable 注解 修饰 成员属性 或 成员函数 , 则表示 函数返回值 或 成员 允许为空 ;

Java 代码示例 : 上述代码使用 @NotNull 和 @Nullable 注解 后代码如下 ;

import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;

public class JavaMethod {

    @NotNull
    public String getName() {
        return "Tom";
    }

    @Nullable
    public String getNullName() {
        return null;
    }
}




二、Kotlin 的 Java 类型映射



Kotlin 代码运行时 , 所有的 数据类型都会映射为 Java 类型 ;


代码示例 : 在代码中 , 定义了 Kotlin 中的 Int 类型变量 , 在运行时 , 调用该变量的 .javaClass 查看其映射的 Java 类型 , 最后打印出的结果为 Java 中的 int 类型 ;

fun main() {
    val number: Int = 1
    println(number.javaClass)
}

执行结果 :

int

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解





三、Kotlin 访问 Java 私有属性



在 Java 中 , 如果要 访问 private 私有属性 , 需要 调用 Getter 和 Setter 方法 ;

在 Kotlin 中 , 直接使用 属性名称 , 即可 访问 Java 中的 private 私有属性 , 该访问包括 读取属性 和 写出属性 操作 ;

  • 读取属性 , 相当于 调用 Getter 函数 ;
  • 修改 / 写出 属性 , 相当于 调用 Setter 函数 ;

代码示例 :

  • Java 类 : 在该 Java 类中定义了 private 私有属性 ;
public class JavaMethod {

    private String name = "Tom";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • Kotlin 代码 : 在 Kotlin 代码中 , 可以通过 实例对象.属性名 访问 Java 类中的 private 私有属性 ;
    • 读取私有属性 : 使用 var name = javaMethod.name 读取 私有属性 , 调用的是 JavaMethod#getName 函数 ;
    • 修改私有属性 : 使用 javaMethod.name = "Jerry" 修改 私有属性 , 调用的是 JavaMethod#setName 函数 ;
fun main() {
    val javaMethod = JavaMethod()

    var name = javaMethod.name
    println(name)
    
    javaMethod.name = "Jerry"

    name = javaMethod.name
    println(name)
}

执行结果 :

Tom
Jerry

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解





四、Java 调用 Kotlin 函数




1、函数调用


在 Java 中调用 Kotlin 脚本中的函数 , 可以直接使用 " Kotlin 文件名 + Kt # 函数名 " 进行调用 , 定义在 Kotlin 文件中的函数相当于 静态函数 , 然后通过静态形式调用 ;


在 Hello.kt 中定义如下函数 : 该函数相当于定义在 HelloKt 类 中的 sayHello 静态函数 ;

fun sayHello() {
    println("Hello World !")
}

在 Java 代码中调用上述函数 :

public class JavaMethod {
    public static void main(String[] args) {
        HelloKt.sayHello();
    }
}

执行结果 :

Hello World !

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


2、分析 Kotlin 代码生成的字节码数据


分析上述 Kotlin 代码的字节码文件 , 在 Kotlin Bytecode 页面 , 查看其 字节码文件 ;
java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解

点击 Decompile 按钮 , 将字节码 反编译回 Java 代码 ,
java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解

由下面的代码可知 , 在 Hello.kt 脚本 中 定义 sayHello 函数 , 其对应的 字节码 反编译 后 的 Java 代码 如下 :

import kotlin.Metadata;

@Metadata(
   mv = {1, 4, 2},
   bv = {1, 0, 3},
   k = 2,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"sayHello", "", "KotlinDemo"}
)
public final class HelloKt {
   public static final void sayHello() {
      String var0 = "Hello World !";
      boolean var1 = false;
      System.out.println(var0);
   }
}

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


3、使用 @JvmName 注解修改 Kotlin 生成的 Java 类名


如果不想 Hello.kt 生成的 Java 类类名为 HelloKt , 可以在 Kotlin 脚本中 使用 @JvmName 注解 修改 Kotlin 生成的 Java 类名 , 相当于 为 Hello.kt 取了一个别名 ;

用法示例 :

@file:JvmName("Hello")

Kotlin 代码示例 :

@file:JvmName("Hello")

fun sayHello() {
    println("Hello World !")
}

Java 代码示例 :

public class JavaMethod {
    public static void main(String[] args) {
        Hello.sayHello();
    }
}

执行结果 :

Hello World !

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解


在快速搜索中 , 选择 Show Kotlin Bytecode 选项 , 查看 Kotlin 的 字节码数据 ;

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解

Kotlin Bytecode 界面 , 选择 Decompile 选项 , 将 字节码数据 反编译字节码为 Java 代码 ;

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解
查看生成的 Java 代码 , 可以看到 最终生成的 Java 字节码中 , 类名为 Hello , 使用 @JvmName 注解 成功 修改 Java 编译类名称 ;

import kotlin.Metadata;
import kotlin.jvm.JvmName;

@Metadata(
   mv = {1, 4, 2},
   bv = {1, 0, 3},
   k = 2,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"sayHello", "", "KotlinDemo"}
)
@JvmName(
   name = "Hello"
)
public final class Hello {
   public static final void sayHello() {
      String var0 = "Hello World !";
      boolean var1 = false;
      System.out.println(var0);
   }
}

java kotlin 可空转换,Kotlin,kotlin,可空性,Java,类型映射,JvmName注解文章来源地址https://www.toymoban.com/news/detail-784832.html

到了这里,关于【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch第八讲 ES索引字段映射类型以及动态映射相关操作

    ES的映射:映射就是 Mapping,它用来定义一个文档以及文档所包含的字段该如何被存储和索引。所以,它其实有点类似于关系型数据库中表的定义。其中ES中映射可以分为动态映射和静态映射,静态映射就是提前创建好对应字段文档映射关系,如果插入的类型不对会出错,而动

    2024年02月10日
    浏览(46)
  • 5.elasticsearch映射操作(创建|修改|删除)及字段类型

    1.本文介绍了 elasticsearch 映射的操作方式,包括映射创建,修改,删除; 2.映射定义: 映射是定义文档及其包含的字段如何存储和索引的过程 。 例如,使用映射来定义: ① 哪些字符串字段应该被作为全文检索字段; ② 哪些字段包含 数字,日期,及地理位置; ③ 日期格式

    2023年04月12日
    浏览(64)
  • From Java To Kotlin 2:Kotlin 类型系统与泛型

    上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java  to Kotlin   第二期。 From Java  to Kotlin  关键在于 思维的转变 。 Kotlin 中大部分语句是 表达式 。 表达式思维是一种编程思维。 编程思维是一种非常抽象的概念,很多时候是只可意会不可言传的。

    2024年02月08日
    浏览(54)
  • 【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val

      📜 本章目录: 0x00 操作符(operators) 0x01 内建类型(Build-in) 0x02 类型转换:显式类型转换 0x03 在较长数字中使用下划线 0x04 字符串(String) 0x05 字符串模板(String Templates) 0x06 字符串连接(变量插值) 0x06 指定变量类型 0x07 可变 var 和不可变 val 0x00 操作符(operators)

    2024年02月11日
    浏览(47)
  • 存储过程、触发器、游标、视图、自定义函数 字段类型、字段可空、统计字段、逻辑删除 权限系统数据库&无限极类别设计

    在数据库设计中,存储过程、触发器、游标、视图、自定义函数、字段类型、字段可空、统计字段、逻辑删除以及权限系统和无限级类别设计都是重要的概念。下面我将逐一解释这些概念,并提供相关的设计建议。 存储过程 (Stored Procedure) 定义 :存储过程是一组为了完成特定

    2024年03月09日
    浏览(128)
  • Java数据类型与变量

    其中的“HelloWord”为字面常量。 1.1字面常量的分类: 1. 字符串常量:由\\\"\\\"(双引号)括起来的,比如“12345”、“hello”、“你好”。 2. 整形常量:程序中直接写的数字(注意没有小数点),比如:100、1000 3. 浮点数常量:程序中直接写的小数,比如:3.14、0.49 4. 字符常量:由 单

    2023年04月09日
    浏览(111)
  • Go语言变量使用指南:声明、类型转换与字符串操作

    深入了解Go语言中变量的声明方式、字符和布尔类型的细节、字符串的不可变性以及基本数据类型之间的转换规则。

    2024年02月10日
    浏览(90)
  • 解密Java数据类型与变量

    目录 1. 字面常量 2. 数据类型 3. 变量 常量即程序运行期间,固定不变的量称为常量 ,比如:一个礼拜七天,一年 12 个月等。 在 Java 中数据类型主要分为两类: 基本数据类型 和 引用数据类型 。 图解如下: 基本数据类型有四类八种 : 1.  四类 :整形、浮点型、字符型及布

    2024年03月15日
    浏览(48)
  • 一文读懂java变量类型

    前言 在学习和使用Java编程语言时,理解变量类型是至关重要的基础知识。Java是一种静态类型语言,强调变量必须先声明其类型,才能进行后续操作。因此,对于初学者来说,了解Java中不同的变量类型及其特性是迈向编程成功的第一步。 本文旨在帮助大家快速、简洁地了解

    2024年02月09日
    浏览(40)
  • 【Java入门】数据类型与变量

    前言 📕作者简介: 热爱跑步的恒川 ,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Java入门篇系列,该专栏主要讲解:什么是java、java的数据类型与变量、运算符、程序的逻辑控制、方法的使用、数组的定义与使、类和对象、继承和

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包