gpt4 book ai didi

java - Kotlin/Java 泛型 : when to expect an IllegalAccessException during instantiation?

转载 作者:行者123 更新时间:2023-12-01 13:01:58 25 4
gpt4 key购买 nike

请考虑以下类(class)

open class BaseClass

class MyClass private constructor(string: String): BaseClass()
还有一个创建实例的通用函数:
inline fun <reified T : BaseClass, reified A : Any> create(arg: A): T = T::class.java.getConstructor(arg::class.java).newInstance(arg)
以下测试失败:
@Test(expected = IllegalAccessException::class)
fun `should throw an IllegalAccessException`() {
val test: MyClass = create("test")
}
因为一个 java.lang.NoSuchMethodException实际上是抛出。 Constructor.newInstance() 的 JavaDoc状态:

@exception IllegalAccessException if this {@code Constructor}objectis enforcing Java language access control and the underlyingconstructor is inaccessible.


私有(private)构造函数符合我对“不可访问构造函数”的期望。为什么这个例子会抛出 NoSuchMethodException而是在什么情况下可以抛出 IllegalAccessException ?

最佳答案

getConstructor方法将尝试仅从公共(public)构造函数列表中选择构造函数,不会考虑私有(private)构造函数。由于找不到公开匹配,它会抛出 NoSuchMethodException .
IllegalAccessException ,另一方面,将被 newInstance 抛出方法如果你使用 getDeclaredConstructor相反,因为此特定方法从所有可用构造函数中选择构造函数,而不仅仅是公共(public)构造函数,因此将检索示例中的私有(private)构造函数,尽管不可访问。

下面会抛出IllegalAccessException :

T::class.java.getDeclaredConstructor(arg::class.java).newInstance(arg)

如果出于某种原因,你想克服这个问题,你可以使用类似的东西:
val ct = T::class.java.getDeclaredConstructor(arg::class.java)
ct.trySetAccessible()
return ct.newInstance(arg)

关于java - Kotlin/Java 泛型 : when to expect an IllegalAccessException during instantiation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62032527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com