[英]Kotlin noarg plugin: Constructor only accessible by java reflection
我的设置有问题,但我不知道是什么问题。 从Kotlin 编译器插件我有以下信息。
无参数编译器插件为具有特定注释的类生成一个额外的零参数构造函数。
生成的构造函数是合成的,因此不能直接从 Java 或 Kotlin 调用,但可以使用反射调用。
也就是说,我认为我可以通过 java 和 kotlin 反射访问 noarg 构造函数,但我只能通过 java 反射访问它。 这是预期的行为,还是我做错了什么?
build.gradle
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.50'
id "org.jetbrains.kotlin.plugin.noarg" version "1.3.50"
id 'application'
id 'java'
}
repositories {
mavenCentral()
jcenter()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
compile group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.3.50'
}
noArg {
annotation('noargdemo.Entity')
}
application {
mainClassName = 'noargdemo.AppKt'
}
package noargdemo
import kotlin.reflect.full.createInstance
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Entity
@Entity
data class Employee(
val firstName : String,
val secondName : String
)
fun main(args: Array<String>) {
val kotlinConstructors = Employee::class.constructors // size is 1
val javaConstructors = Employee::class.java.constructors // size is 2
val instance1 = Employee::class.java.getConstructor().newInstance() // works
val instance2 = Employee::class.createInstance() // doesnt work
}
这是预期的行为,即使在您引用的描述中也有说明:
生成的构造函数是合成的,因此不能直接从 Java 或 Kotlin 调用,但可以使用反射调用。
合成方法是编译器为内部目的生成的方法,它们不能从源代码中手动调用,但它们对于反射是可见的。
您可以使用 Method.isSynthetic 检查方法是否是合成的: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#isSynthetic--
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.