繁体   English   中英

Kotlin noarg 插件:构造函数只能由 java 反射访问

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM