Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
@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!")
}
}
アノテーション一覧
| アノテーション | 概要 |
|---|---|
| @JvmStatic | companion 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を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。