# 1. 前言
| 符號 | 說明 |
| --- | --- |
| `@JvmName` | 指定`kotlin`編譯類的名字 |
| `@JvmField` | 指定可直接訪問類的屬性,而不是`getXX`或者`setXX`方法 |
| `@JvmOverloads` | 指定重載`Kotlin`的默認參數方法 |
| `@JvmStatic` | 指定`Kotlin`的半生對象的靜態方法的直接點好調用 |
| `@Throws` | 指定拋出的異常類型 |
# 2. 使用案例
## 2.1 @JvmName
新建一個`KotlinDemo.kt`文件,然后寫入一個供外部`Java`程序調用的方法:
~~~
package com.kotlinLearn
fun isPrime(number: Int): Boolean {
(2 until number).map {
if(number % it == 0)
return false
}
return true
}
~~~
我們就可以在`A.java`文件中進行調用,比如:
~~~
package com.kotlinLearn;
public class A {
public static void main(String[] args) {
boolean prime = KotlinDemoKt.isPrime(4);
System.out.println(prime ? "素數" : "非素數");
}
}
~~~
結果:
```
非素數
```
雖然可以實現調用,但是我們需要暴露自己的`kotlin`文件名,所以這里可以使用`JvmName`來進行重命名:
~~~
@file:JvmName("MyUtils")
package com.kotlinLearn
fun isPrime(number: Int): Boolean {
(2 until number).map {
if(number % it == 0)
return false
}
return true
}
~~~
對應的我們在調用的時候,所使用的就是:
~~~
boolean prime = MyUtils.isPrime(4);
~~~
## 2.2 @JvmField
類似的我們在`KotlinDemo.kt`文件中定義一個類:
~~~
class User{
var name: String? = null
}
~~~
然后在`A.java`文件中調用,可以看見下圖:

也就是說其實默認的調用可以使用`get`和`set`來獲取到在`kotlin`中的屬性,但是有些時候我們期望可以直接訪問到屬性,而不是`get`或者`set`方法。那么就可以使用`@JvmField`來實現:
~~~
@file:JvmName("MyUtils")
package com.kotlinLearn
class User{
@JvmField
var name: String? = null
}
~~~
然后在`A.java`中調用:
~~~
user.name = "李四";
~~~
## 2.3 @JvmField
在`Kotlin`和`Python`中使用類似,我們可以定義一些默認參數,然后可以有默認的實現效果。比如:
~~~
@file:JvmName("MyUtils")
package com.kotlinLearn
class User(@JvmField var name: String, @JvmField var age: Int) {
override fun toString(): String {
return "User(name='$name', age=$age)"
}
}
fun generateUser(name: String = "張三", age: Int = 23): User{
return User(name, age)
}
fun main() {
val user = generateUser()
println(user)
}
~~~
結果:
```
User(name='張三', age=23)
```
同樣的,我們在`A.java`中調用:
~~~
package com.kotlinLearn;
public class A {
public static void main(String[] args) {
User user = MyUtils.generateUser("李四", 23);
System.out.println(user);
}
}
~~~
但是,由于在`Java`中默認并不支持,所以我們定義默認參數其實底層就是函數重載,比如:
~~~
public User generateUser(String name, int age){
return new User(name, age);
}
public User generateUser(String name){
return generateUser(name, 23);
}
public User generateUser(int age){
return generateUser("張三", age);
}
public User generateUser(){
return generateUser("張三", 23);
}
~~~
但是確實寫起來比較麻煩。所以在`Java`調用`Kotlin`中含有默認的參數的時候,可以使用`@JvmOverloads`關鍵字實現,比如:
~~~
@JvmOverloads
fun generateUser(name: String = "張三", age: Int = 23): User{
return User(name, age)
}
~~~
調用:
~~~
public class A {
public static void main(String[] args) {
User user = MyUtils.generateUser("李四");
System.out.println(user);
}
}
~~~
## 2.4 @JvmStatic
在`Kotlin`中不再有靜態屬性和方法,對應的是一個伴生對象。比如下面的案例:
~~~
class User(@JvmField var name: String, @JvmField var age: Int) {
override fun toString(): String {
return "User(name='$name', age=$age)"
}
// 定義伴生對象
companion object {
var UUID: String = "1231232"
fun getUUID() = println(UUID)
}
}
~~~
然后在`kotlin`中調用:
~~~
fun main() {
// 和Java中靜態類似,可以直接通過類來訪問
User.Companion.getUUID()
User.getUUID()
}
~~~
不妨繼續在`A.java`文件中進行調用:
~~~
public class A {
public static void main(String[] args) {
// 通過@JvmField轉為可以直接調用
System.out.println(User.UUID);
// 調用方法
User.Companion.getUUID();
// 通過@JvmStatic將方法轉為可直接調用
User.getUUID();
}
}
~~~
當然,對應的`Kotlin`的代碼中添加了兩個注解:
~~~
// 定義伴生對象
companion object {
@JvmField
var UUID: String = "1231232"
@JvmStatic
fun getUUID() = println(UUID)
}
~~~
需要注意的是,在伴生對象中對屬性和方法分別使用`@JvmField`和`@JvmStatic`兩個關鍵字。
## 2.5 @Throws
~~~
// 定義:該方法拋出一個IO異常
fun getUser(){
throw IOException()
}
~~~
然后在`Java`中調用:
~~~
public class A {
public static void main(String[] args) {
// 調用異常
MyUtils.getUser();
}
}
~~~
但是代碼沒有提示需要使用`try-catch`來對異常進行捕獲,運行:
```
Exception in thread "main" java.io.IOException
at com.kotlinLearn.MyUtils.getUser(KotlinDemo.kt:34)
at com.kotlinLearn.A.main(A.java:6)
```
所以可以添加一個`@Throws`注解進行說明:
~~~
// 定義:該方法拋出一個IO異常
@Throws(IOException::class)
fun getUser(){
throw IOException()
}
~~~
然后調用的時候就會有對應的異常提示,如下圖:

- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room