kotlin(十七)Kotlin和Java相互调用

Posted niuyongzhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin(十七)Kotlin和Java相互调用相关的知识,希望对你有一定的参考价值。

1.Kotlin调用Java的方法和属性

 1)定义java类

public class JavaClass 
    private String javaString = "java";
    public void sayHello(String name) 
        System.out.println("Hello " + name);
    

    public String getJavaString() 
        return javaString;
    

Kotlin调用Java.由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常


fun main() 
    val java = JavaClass()
    java.sayHello("Java")
    println(java.javaString)
    //由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常
    val javaString:String? = java.javaString
    javaString?.uppercase()

2)定义kotlin类

class KotlinClass 
    val kotlinString="Kotlin"

    fun sayHello(name: String) 
        println("Hello $name")
    

Java中调用Kotlin中的属性和方法

 public static void main(String[] args) 
        KotlinClass kotlin = new KotlinClass();
        kotlin.sayHello("Kotlin");
       String kotlinString =  kotlin.getKotlinString();
        System.out.println(kotlinString);
    

Java中访问Kotlin中的属性,必须通过getter setter方法。如果想直接访问,得需要在kotlin中定义的属性加上。


class KotlinClass 
    @JvmField
    val kotlinString="Kotlin"


 public static void main(String[] args) 
     KotlinClass kotlin = new KotlinClass();
     String kotlinString =  kotlin.kotlinString;
     System.out.println(kotlinString);

2.当定义的kotlin函数参数有默认值时,@JvmOverloads 可以使kotlin编译器生产重载方法。

class KotlinClass 
    @JvmOverloads
    fun sayHello(name: String = "kotlin") 
        println("Hello $name")
    


 public static void main(String[] args) 
     KotlinClass kotlin = new KotlinClass();
     kotlin.sayHello();
     kotlin.sayHello("Kotlin");
 

看一下kotlin通过编译器生成的重载方法

public final class KotlinClass 
   @JvmOverloads
   public final void sayHello(@NotNull String name) 
      Intrinsics.checkNotNullParameter(name, "name");
      String var2 = "Hello " + name;
      System.out.println(var2);
   

   // $FF: synthetic method
   public static void sayHello$default(KotlinClass var0, String var1, int var2, Object var3) 
      if ((var2 & 1) != 0) 
         var1 = "kotlin";
      

      var0.sayHello(var1);
   

   @JvmOverloads
   public final void sayHello() 
      sayHello$default(this, (String)null, 1, (Object)null);
   

3.Java访问Kotlin中的伴生对象属性和方法。

class KotlinClass 

    companion object 
        val HELLO_WORLD = "hello world"
        fun sayHello() = println(HELLO_WORLD)
    


 public static void main(String[] args) 
        KotlinClass.Companion.getHELLO_WORLD();
        KotlinClass.Companion.sayHello();
    

@JvmField 可以以静态的方法来访问伴生对象中定义的属性。

@JvmStatic定义在函数上,可以直接调用伴生对象中的函数。

class KotlinClass 

    companion object 
        @JvmField
        val HELLO_WORLD = "hello world"
        @JvmStatic
        fun sayHello() = println(HELLO_WORLD)
    


   public static void main(String[] args) 
//     KotlinClass.Companion.getHELLO_WORLD();
//     KotlinClass.Companion.sayHello();
       String hello =  KotlinClass.HELLO_WORLD;
       KotlinClass.sayHello();
    

4.异常处理。

 1)Kotlin捕获Java中的异常

     java中抛出的异常,在java中调用时,编译器会自动提示要捕获异常。

    但是在Kotlin中调用时,不捕获异常也会编译通过

public class JavaClass 
    public void testException() throws IOException 
        System.out.println("exception");
    

    public static void main(String[] args) 
        try 
            new JavaClass().testException();
         catch (IOException e) 
            e.printStackTrace();
        
    


Kotlin中调用java代码
fun main() 
    val java = JavaClass()
    java.testException();

2)在Kotlin中抛出的异常,必须加上Throws注解,在java中才会自动提示捕获异常。

      @Throws(IOException::class) 

class KotlinClass 
    @Throws(IOException::class)
    fun testException()
        throw IOException()
    


public class JavaClass 
    public void testException() throws IOException 
        System.out.println("exception");
    

    public static void main(String[] args) 
        KotlinClass kotlin = new KotlinClass();
        try 
            kotlin.testException();
         catch (IOException e) 
            e.printStackTrace();
        
    

5.Java中调用Kotlin中定义的匿名函数

 在kotlin中定义两个匿名函数,一个是一个参数,一个是两个参数。

class KotlinClass 
   val sayHello =  name:String ->
        println("Hello $name")
   
    val sayHello2 =  name:String,name2:String ->
        println("Hello $name and $name2")
    

在java中调用Kotlin中的匿名函数。通过Function1 invoke,可以调用一个参数的匿名函数,

通过Function2.invoke可以调用两个参数的匿名函数,一次类推可以从Function0--Function22.

Function0代表无参的匿名函数,Function22最多可以接收22个参数。

 public static void main(String[] args) 
        KotlinClass kotlin = new KotlinClass();

        Function1 function1 = kotlin.getSayHello();
        function1.invoke("HanMei");

        Function2 function2 = kotlin.getSayHello2();
        function2.invoke("HanMei","LiLei");
    

以上是关于kotlin(十七)Kotlin和Java相互调用的主要内容,如果未能解决你的问题,请参考以下文章

kotlin和java相互转换的实操

kotlin和java相互转换的实操

kotlin和java相互转换的实操

Kotlin 为什么可以和Java混合开发

Kotlin 为什么可以和Java混合开发

Kotlin 为什么可以和Java混合开发