Метод getConstructor
попытается выбрать конструктор только из списка конструкторов publi c, частные конструкторы не будут рассматриваться. Поскольку он не может найти совпадение publi c, оно выдает NoSuchMethodException
.
IllegalAccessException
, с другой стороны, будет выброшено методом newInstance
, если вы используете getDeclaredConstructor
вместо этого, потому что это конкретный метод выбирает конструктор из всех доступных конструкторов, а не только из publi c, поэтому частный конструктор в вашем примере будет извлечен, хотя и недоступен.
Приведенное ниже вызовет 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)