Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. @JvmStatic / @JvmField

@JvmStatic / @JvmField

KotlinとJavaの相互運用をスムーズにするために、『@JvmStatic』『@JvmField』などのアノテーションが用意されています。JavaからKotlinのコードを呼び出す場合に、Kotlinのコンパニオンオブジェクトや関数を自然なJavaスタイルで使えるようになります。

構文
class MyClass {
    companion object {
        @JvmStatic
        fun staticMethod() { }   // Java から MyClass.staticMethod() で呼べます

        @JvmField
        val CONSTANT = "value"   // Java から MyClass.CONSTANT で直接アクセスできます
    }

    @JvmOverloads
    fun greet(name: String = "World", greeting: String = "Hello") {
        println("$greeting, $name!")
    }
}
アノテーション一覧
アノテーション概要
@JvmStaticcompanion object のメソッドを Java 静的メソッドとして生成します。
@JvmFieldプロパティを Java のフィールドとして直接アクセス可能にします。getter/setter が生成されません。
@JvmOverloadsデフォルト引数のある関数からオーバーロードメソッドを生成します。
@Throws(例外::class)Java の checked exception を宣言します。Javaコードがキャッチできるようになります。
@JvmName("名前")生成されるバイトコードのメソッド・クラス名を変更します。
サンプルコード
import java.io.IOException

class DatabaseHelper {
    companion object {
        // @JvmStatic で Java から DatabaseHelper.create() のように呼べます。
        @JvmStatic
        fun create(url: String): DatabaseHelper {
            println("接続: $url")
            return DatabaseHelper()
        }

        // @JvmField でフィールド直接アクセスを可能にします。
        @JvmField
        val DEFAULT_URL = "jdbc:sqlite:local.db"
    }

    // @JvmOverloads でデフォルト引数のオーバーロードを生成します。
    @JvmOverloads
    fun query(sql: String, limit: Int = 100, offset: Int = 0): List<String> {
        println("クエリ: $sql (limit=$limit, offset=$offset)")
        return listOf("row1", "row2")
    }

    // @Throws で Java 側で catch できる例外を宣言します。
    @Throws(IOException::class)
    fun readFile(path: String): String {
        // IOException を投げる可能性がある処理
        return "file content"
    }
}

fun main() {
    // @JvmStatic があるので Companion を経由せずに呼べます。
    val db = DatabaseHelper.create(DatabaseHelper.DEFAULT_URL)

    // デフォルト引数を省略して呼び出します。
    db.query("SELECT * FROM users")
    db.query("SELECT * FROM products", 50)
    db.query("SELECT * FROM orders", 10, 20)

    // @Throws で宣言した例外
    val content = db.readFile("/path/to/file")
    println(content)
}
概要

Kotlinは完全なJava相互運用性を持ちますが、デフォルトではKotlinの『companion object』のメンバーをJavaから呼ぶ際に『MyClass.Companion.method()』のような記法が必要です。『@JvmStatic』を付けることで『MyClass.method()』という自然なJava記法で呼べるようになります。

KotlinのみのプロジェクトではJVM向けアノテーションは不要ですが、AndroidのJavaコードや既存のJavaライブラリとの連携が必要な場合に活用してください。

オブジェクト宣言の詳細はobject / companion objectを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。