1. 程式人生 > 程式設計 >教你一文搞懂Kotlin中的Jvm註解

教你一文搞懂Kotlin中的Jvm註解

JvmOverloads

建立一個kotlin的類

class Student(val name: String,val sex: Int = 1,val age: Int = 18)

可以看出來 這個建構函式的引數是有預設值的,kotlin的特性對吧,我們在使用的時候可以方便的使用,比如:

 val student = Student("wuyue")
 val student2 = Student("wuyue",age = 18)

但是這個特性如果你用java來呼叫你就是失敗的了。

教你一文搞懂Kotlin中的Jvm註解

注意看下面的方法呼叫是報錯的,不能調,只能選擇3個建構函式的方法。

那我一定要讓java也可以呼叫 怎麼辦? 加上註解即可:

class Student @JvmOverloads constructor(val name: String,val age: Int = 18)

這個對於android程式設計師來說還是很重要的,比如我們自定義view中 就需要這個註解,否則執行起來 會因為找不到方法而報錯的。

所以大家只要謹記一點: 當你的kotlin程式碼中的某個方法使用了 預設引數值 這個kotlin語言的特性並且這個方法還要給java程式碼呼叫的時候那你最好加上JvmOverloads 註解

JvmName

我們給String 增加一個擴充套件函式 StringsHelper.kt 檔案

package com.test
fun String.appendUserName():String{
  return this+"wuyue"
}

在java的世界裡 怎麼呼叫他呢?

StringsHelperKt.appendUserName("hello");

很好理解對吧, 但是很多人都習慣於在java的世界中 使用什麼xxxUtils 去處理類似的情況。這個時候就要利用到這個JvmName了

@file:JvmName("StringsHelperUtils")
package com.test
fun String.appendUserName():String{
  return this+"wuyue"
}

如此一來 我們在java的世界中 呼叫他的方法就變成了

StringsHelperUtils.appendUserName("hello");

JvmMultifileClass

關於這個註解 網上的說法是 可以將2個kt檔案 裡面的程式碼 合併到一個java的class檔案中。

FunA.kt

@file:JvmName("Utils")
@file:JvmMultifileClass

package com.test

fun one(){

}

FunB.kt

@file:JvmName("Utils")
@file:JvmMultifileClass

package com.test

fun two(){

}

這樣在java世界中 呼叫Utils這個類 就有one和two 2個方法了,但是我自己的實驗結果 我就算去掉這個JvmMultifileClass 這個註解也一樣可以達到效果。似乎這個註解並沒有什麼用? 可能是1.3之後的kotlin版本 優化了 JvmName的實現吧。 這裡有知道原因的大佬可以指點一下。

JvmField

還是前面這個Student的例子

class Student( val name: String,val age: Int = 18)

如果在java程式碼裡 你要呼叫他裡面的屬性 只能通過get和set 來呼叫。 但是如果你加上註解

class Student(@JvmField val name: String,val age: Int = 18)

那他在java的世界中就可以 直接呼叫了

student.name="hello";

另外還有一個重要的作用是: 在kotlin中, val 並不意味著是常量,只不過val 宣告的變數 是沒有set方法的,只有get方法。所以給了你一個常量的錯覺。 你要真正的 在kotlin中 定義一個常量,只有兩種方法:

  1. 在top-level或者object中 使用 const val
  2. 或者使用 @JvmField val(這種方式定義的就是常量了,講白了你也無法重寫val的get方法了)

JvmStatic

class StaticTest{
  companion object{

    const val field1="111"
    
    val field2="222"
    
    @JvmField val field3="333"

    fun callNonStatic(){

    }
    @JvmStatic
    fun callStatic(){

    }
  }
}

我們看一下 在java程式碼中 怎麼呼叫他們 就知道這個註解的實際作用了

  StaticTest.callStatic();
    StaticTest.Companion.callNonStatic();
    String t1 = StaticTest.field1;
    String t2=StaticTest.Companion.getField2();
    String t3=StaticTest.field3;

JvmSynthetic

這個註解用的不多,但是kotlin的許多官方庫會用到他 講白了 如果你寫的一個函式你只想給kotlin程式碼呼叫 而不想給java的程式碼呼叫 那你就在你的函式上面加上這個註解即可

例如:

@file:JvmName("StringsHelperUtils")
package com.test
@JvmSynthetic
fun String.appendUserName():String{
  return this+"wuyue"
}

這樣你就會發現 這個函式 你用kotlin正常使用 而java程式碼裡StringsHelperUtils 這個類 是沒有這個方法的

到此這篇關於教你一文搞懂Kotlin中的Jvm註解的文章就介紹到這了,更多相關Kotlin Jvm註解內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!