2020-06-09 kotlin之 @JvmOverloads 的作用

kotlin之 @JvmOverloads 的作用

@JvmOverloads 介紹

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR]) annotation class JvmOverloads

Instructs the Kotlin compiler to generate overloads for this function that substitute default parameter values.
If a method has N parameters and M of which have default values, M overloads are generated: the first one takes N-1 parameters (all but the last one that takes a default value), the second takes N-2 parameters, and so on.
官網(wǎng)鏈接
以上就是kotlin官方對于kotlin @JvmOverloads 作用的解釋磅叛。
中文翻譯如下:
指示Kotlin編譯器為該函數(shù)生成替代默認參數(shù)值的重載贝椿。
如果一個方法有N個參數(shù)媳维,其中M個參數(shù)有默認值惠奸,那么就會生成M個重載紊扬。:第一個方法有N-1個參數(shù),第二個方法有N-2個參數(shù)烛亦,依此類推(除了最后一個方法都有默認值)坝咐。

加與不加@JvmOverloads對比

來段代碼對比下吧。
定義一個printPersonInfo方法撒桨,打印人物信息查刻,我們可以看到有兩個參數(shù)是有默認值的。

不加@JvmOverloads

首先讓我們看看不加@JvmOverloads 的情況

fun printPersonInfo(age:Int=0,name:String,sex:String="男"){
    println("姓名:$name 年齡:$age  性別:$sex")
}
fun main() {
    printPersonInfo(name = "chl")
}

其對應的反編譯Java代碼如下

public static final void overloadTest(int age, @NotNull String name, @NotNull String sex) {
    Intrinsics.checkParameterIsNotNull(name, "name");
    Intrinsics.checkParameterIsNotNull(sex, "sex");
    String var3 = "姓名:" + name + " 年齡:" + age + "  性別:" + sex;
    boolean var4 = false;
    System.out.println(var3);
 }

 // $FF: synthetic method
 public static void overloadTest$default(int var0, String var1, String var2, int var3, Object var4) {
    if ((var3 & 1) != 0) {
       var0 = 0;
    }

    if ((var3 & 4) != 0) {
       var2 = "男";
    }

    overloadTest(var0, var1, var2);
 }
 
 public static final void main() {
      overloadTest$default(0, "chl", (String)null, 5, (Object)null);
   }

我們可以看到其對應的Java代碼是通過生成了一個 overloadTest$default方法凤类,這個方法成為了外部調(diào)用的方法唉擂,在這個方法里面晃痴,進行了數(shù)據(jù)默認值的處理,然后再調(diào)用 overloadTest方法。

加@JvmOverloads

接下來我們再來看下加上@JvmOverloads注解的函數(shù)盘寡。

@JvmOverloads fun printPersonInfo(age:Int=0,name:String,sex:String="男"){
    println("姓名:$name 年齡:$age  性別:$sex")
}

對應Java代碼

@JvmOverloads
   public static final void printPersonInfo(int age, @NotNull String name, @NotNull String sex) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      Intrinsics.checkParameterIsNotNull(sex, "sex");
      String var3 = "姓名:" + name + " 年齡:" + age + "  性別:" + sex;
      boolean var4 = false;
      System.out.println(var3);
   }

   // $FF: synthetic method
   public static void printPersonInfo$default(int var0, String var1, String var2, int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var0 = 0;
      }

      if ((var3 & 4) != 0) {
         var2 = "男";
      }

      printPersonInfo(var0, var1, var2);
   }

   @JvmOverloads
   public static final void printPersonInfo(int age, @NotNull String name) {
      printPersonInfo$default(age, name, (String)null, 4, (Object)null);
   }

   @JvmOverloads
   public static final void printPersonInfo(@NotNull String name) {
      printPersonInfo$default(0, name, (String)null, 5, (Object)null);
   }

   public static final void main() {
      printPersonInfo$default(0, "chl", (String)null, 5, (Object)null);
   }

從以上代碼可以看到,@JvmOverloads 注解的函數(shù)恳啥,對應的Java文件生成了一個所有參數(shù)都有的方法外油狂,還生成了2個重載方法,第一個2個參數(shù)企锌,第二個 1個參數(shù)榆浓。而所有的邏輯都在那個有所有參數(shù)的方法中,其他的方法通過調(diào)用printPersonInfo$default來訪問該方法撕攒。

為什么用@JvmOverloads

通過以上代碼我們明白了 @JvmOverloads的作用陡鹃,但是我們在使用kotlin編寫代碼時候烘浦。似乎@JvmOverloads對我們的編碼毫無影響,我們?yōu)槭裁匆由纤仄季ǎ窟@其實主要是為了在java中調(diào)用kotlin代碼的時候能夠使用闷叉,如果不加 @JvmOverloads , 當我們想要在Java中調(diào)用kotlin的方法時脊阴,是必須輸入所有參數(shù)的值得握侧,kotlin中默認參數(shù)我們無法使用。而當加上 @JvmOverloads 嘿期,kotlin編譯器生成的字節(jié)碼中有對應的重載方法品擎,我們就可以通過Java的重載方式來使用kotlin的代碼了,不必要輸入所有的參數(shù)备徐。

@JvmOverloads 使用范圍

kotlin中 構造函數(shù)萄传、頂級函數(shù)、類中方法蜜猾,靜態(tài)方法(@Jvmstatic修飾) 均可以采用@JvmOverloads生成對應重載方法秀菱。
在主構造函數(shù)使用重載函數(shù),效果如下
kotlin代碼

class People @JvmOverloads constructor(age:Int=0,name:String,sex:String="男"){

}

java代碼

public final class People {
   @JvmOverloads
   public People(int age, @NotNull String name, @NotNull String sex) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      Intrinsics.checkParameterIsNotNull(sex, "sex");
      super();
   }
   // $FF: synthetic method
   public People(int var1, String var2, String var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 1) != 0) {
         var1 = 0;
      }
      if ((var4 & 4) != 0) {
         var3 = "男";
      }
      this(var1, var2, var3);
   }

   @JvmOverloads
   public People(int age, @NotNull String name) {
      this(age, name, (String)null, 4, (DefaultConstructorMarker)null);
   }
   @JvmOverloads
   public People(@NotNull String name) {
      this(0, name, (String)null, 5, (DefaultConstructorMarker)null);
   }
}

小結

本文主要講述了@JvmOverloads 關鍵字的作用蹭睡,其對應java代碼中效果衍菱,以及為什么使用@JvmOverloads關鍵字,如有問題肩豁,還請批評指正脊串!

原創(chuàng)聲明

作者:陳浩亮

鏈接:

  1. 掘金 kotlin之 @JvmOverloads 的作用
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蓖救,隨后出現(xiàn)的幾起案子洪规,更是在濱河造成了極大的恐慌,老刑警劉巖循捺,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩例,死亡現(xiàn)場離奇詭異,居然都是意外死亡从橘,警方通過查閱死者的電腦和手機念赶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恰力,“玉大人叉谜,你說我怎么就攤上這事〔任” “怎么了停局?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我董栽,道長码倦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任锭碳,我火速辦了婚禮袁稽,結果婚禮上,老公的妹妹穿的比我還像新娘擒抛。我一直安慰自己推汽,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布歧沪。 她就那樣靜靜地躺著歹撒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槽畔。 梳的紋絲不亂的頭發(fā)上栈妆,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天胁编,我揣著相機與錄音厢钧,去河邊找鬼。 笑死嬉橙,一個胖子當著我的面吹牛早直,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播市框,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼霞扬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枫振?” 一聲冷哼從身側響起喻圃,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粪滤,沒想到半個月后斧拍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡杖小,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年肆汹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予权。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡昂勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扫腺,到底是詐尸還是另有隱情岗照,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站攒至,受9級特大地震影響煞肾,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嗓袱,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一籍救、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渠抹,春花似錦蝙昙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至放航,卻和暖如春烈拒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广鳍。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工荆几, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赊时。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓吨铸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祖秒。 傳聞我的和親對象是個殘疾皇子诞吱,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348