Reflection 如何使用Kotlin中的默认构造函数参数值实例化对象?
我有一个带有默认值的数据类Reflection 如何使用Kotlin中的默认构造函数参数值实例化对象?,reflection,kotlin,kotlin-null-safety,kotlin-reflect,Reflection,Kotlin,Kotlin Null Safety,Kotlin Reflect,我有一个带有默认值的数据类 data class Project( val code: String, val name: String, val categories: List<String> = emptyList()) 数据类项目( val代码:字符串, val name:String, val类别:List=emptyList()) 当某些值为null时,Java反射无法实例化该类。我有个例外 java.lang.IllegalArgumentE
data class Project(
val code: String,
val name: String,
val categories: List<String> = emptyList())
数据类项目(
val代码:字符串,
val name:String,
val类别:List=emptyList())
当某些值为null时,Java反射无法实例化该类。我有个例外
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories
java.lang.IllegalArgumentException:指定为非null的参数为null:method Project.,参数类别
这是因为java.lang.reflect.Constructor.InstanceClass
方法要求参数不为null
我有类型信息,我有构造函数定义,但我不确定如何调用构造函数以使其使用默认值(值来自数据库,并且
类别可以null
)。有没有办法在Kotlin中实现这一点?在Kotlin中使用:
只有当构造函数的特定参数根本没有传递给它时,才会使用构造函数中的默认值。这意味着这样做是为了实现参数化构造函数的各种组合。
比如说,
data class Bird (val name: String = "peacock", val gender: String = "male")
当用作Bird()、Bird(“dove”)或Bird(gender=“female”)时,采用默认值
那么,要解决您的问题,您必须添加?“类别”参数旁边。
像这样,
data class Project(val code: String,
val name: String,
val categories: List<String>?)
即在另一个kotlin类中使用此数据类时
在JAVA中使用:
但是,如果您想在任何java类中使用这个数据类,那么@Hotkey说默认情况下不支持它,因为kotlin通过在引擎盖下使用一些方法来支持这个默认参数
所以,为了使它与java类兼容,您必须添加注释,但不能像@Hotkey所说的那样添加注释
data class Project @JvmOverloads constructor(val code: String,
val name: String,
val categories: List<String>? = emptyList())
数据类项目@JVM重载构造函数(val代码:String,
val name:String,
val类别:列表?=emptyList())
Kotlin默认参数与Java反射不兼容,这意味着没有简单的方法将它们一起使用,因为Kotlin默认参数实际上与一个单独的方法一起工作,该方法还通过一个位掩码来指定哪些参数是默认参数
有两种方法可以解决这个问题
- 使用Kotlin反射。例如,该函数支持默认参数,可以从映射中省略这些参数
- 使用可以在Java中调用的
@JvmOverloads
data class Project(
val code: String,
val name: String,
val categories: List<String> = emptyList()
)
@JvmOverloads
数据类项目(
val代码:字符串,
val name:String,
val类别:List=emptyList()
)
@JvmOverloads
data class Project(
val code: String,
val name: String,
val categories: List<String> = emptyList()
)