概要
(自分メモ) 自動生成されるコードをリンクする要件があったのでお試し。
型安全を台無しにするので普段使ってはいけない(んなやつイネー)
環境
- Ubuntu 24.04
- Java JDK 21.0.6
- Kotlin 2.0.10 (jvmプラットフォームのみ可)
ソース
指定パッケージ内のクラスをリストする例
src/jvmMain/Main.kt
package smpl
fun main() {
val packageName = "smpl"
val refs = Reflections(
ConfigurationBuilder().setUrls(ClasspathHelper.forPackage(packageName))
.setScanners(SubTypesScanner(false), TypeAnnotationsScanner())
)
val classes = refs.getSubTypesOf(Any::class.java).map { it.kotlin }
classes.forEach { c ->
println("${c.supertypes.joinToString()}.${c.simpleName}")
c.members.forEach { println(it) }
}
}
クラスの情報を判別する
src/jvmMain/Main.kt
// リフレクションによりKClass#is~関数のうち引数を与えないものすべて抽出し実行する
inline fun <reified T : Any> listClassInfo(clazz: KClass<T>) {
KClass::class.members.forEach { m ->
if (m.name.startsWith("is") && m.parameters.size <= 1) println("${m.name}: ${m.call(clazz)}")
}
// すなわち
// println("isData: ${clazz.isData}")
// println("isSealed: ${clazz.isSealed}")
// println("isInner: ${clazz.isInner}")
// println("isAbstract: ${clazz.isAbstract}")
// println("isCompanion: ${clazz.isCompanion}")
// println("isFinal: ${clazz.isFinal}")
// println("isOpen: ${clazz.isOpen}")
// println("isFun: ${clazz.isFun}")
// println("isValue: ${clazz.isValue}")
}
テスト/実行
sh gradlew jvmRun -DmainClass=smpl.MainKt