Java构造函数反射使用密封类抛出异常

时间:2017-06-01 12:13:52

标签: java reflection kotlin

我在Kotlin项目中有以下密封课程:

sealed class Test {

    abstract val test: String

    @NoArg
    data class Test1(
            override val test: String
    ) : Test()

    @NoArg
    data class Test2(
            override val test: String
    ) : Test()
}

@NoArg注释是一个标记,编译器配置为为这些类生成无参数构造函数。

我的问题是尝试使用Java反射实例化Test1Test2导致以下异常:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at MainKt.main(Main.kt:27)
Caused by: java.lang.IllegalAccessError: tried to access method Test.<init>()V from class Test$Test1
    at Test$Test1.<init>(Main.kt)
    ... 5 more

当我尝试使用Spring Data Mongo从Mongo数据库加载这些类的实例时,我最初遇到了这个问题。

我在此测试期间用于实例化它们的代码如下:

val javaConstructor = Test.Test1::class.java.getConstructor()
        ?: error("Did not find constructor")

val instance = javaConstructor.newInstance()

我目前的解决方法是不使用解决异常的密封类。有没有办法保持密封的类并使Java反射正常工作?我不认为这是预期的行为,但也许有某种理由呢?如果是这样,我有兴趣听听它是什么。

我在这里有一个问题的例子:https://github.com/mhlz/playground

0 个答案:

没有答案