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