しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Kotlinの::構文について調べる

Kotlinに時々出てくる::構文について調べてみました。

::ですが下のようにメソッドを変数化する時に利用します。

val myMethod = ::test
myMethod()
myMethod()

fun test() {
    Log.e("test", "TEST")
}

他にはクラス情報を取得する時にも利用します。
クラス情報はIntentの引数などに使います。

val myClass = MainActivity::class.java

val intent = Intent(context, myClass)

下のようにbuild.gradleにkotlin-reflectを入れればクラスのメソッドやプロパティー一覧にアクセスする事ができます。

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.0"
}

アクセス方法は下のとおりです。

val myClass = MainActivity::class
myClass.members.forEach {
    Log.e("test", "${it.name}")
}

下のようにプロパティーの情報を取得する事も可能です。
以下ではプロパティーの戻り値の型を取得しています。

class MainActivity : AppCompatActivity() {
    var test = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val p = ::test
        Log.e("test", "${p.returnType}") // → kotlin.String
    }
}

上の方法を使ってlateinitのプロパティーの初期化がされているかを調べる事もできます。

class MainActivity : AppCompatActivity() {
    lateinit var test: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val isInitialized = ::test.isInitialized
    }
}

この方法はlateinit以外の変数で使おうとするとコンパイルエラーになります。

class MainActivity : AppCompatActivity() {
    var test: String = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val isInitialized = ::test.isInitialized
    }
}

参考URL

Kotlinの.isInitialized呼び出しになぜCallableReferenceの指定が必要なのか | thara.dev