Kotlin 如何确定类是数据?
我的项目中有一个数据类。将此类始终保持为“数据”非常重要,并且其所有属性也必须是数据类(或原语) 有没有办法通过编程来确定project中的某个类仍然是数据类,并且它只由数据类组成,而这些数据类都由数据类等组成?您必须使用。您可以检查Kotlin 如何确定类是数据?,kotlin,reflection,Kotlin,Reflection,我的项目中有一个数据类。将此类始终保持为“数据”非常重要,并且其所有属性也必须是数据类(或原语) 有没有办法通过编程来确定project中的某个类仍然是数据类,并且它只由数据类组成,而这些数据类都由数据类等组成?您必须使用。您可以检查KClass.isData和Class.isPrimitive方法。我想会是这样的: fun isSafe(kClass: KClass<*>): Boolean { if (!(kClass.isData || kClass.java.isPr
KClass.isData
和Class.isPrimitive
方法。我想会是这样的:
fun isSafe(kClass: KClass<*>): Boolean {
if (!(kClass.isData || kClass.java.isPrimitive)) {
return false
}
for (property in kClass.memberProperties) {
val field = property.javaField ?: continue
if (!isSafe(field.type.kotlin)) {
return false
}
}
return true
}
class Test1
data class Test2(val v: Int, private val t: Test3)
data class Test3(val v: Int, private val t: Int)
data class Test4(val t: Test1)
fun main() {
println(isSafe(Test2::class)) // print true
println(isSafe(Test4::class)) // print false
}
fun-isSafe(kClass:kClass):布尔值{
if(!(kClass.isData | | kClass.java.isPrimitive)){
返回错误
}
for(kClass.memberProperties中的属性){
val field=property.javaField?:是否继续
if(!isSafe(field.type.kotlin)){
返回错误
}
}
返回真值
}
类Test1
数据类Test2(val v:Int,private val t:Test3)
数据类Test3(val v:Int,private val t:Int)
数据类Test4(val t:Test1)
主要内容(){
println(isSafe(Test2::class))//print true
println(isSafe(Test4::class))//打印错误
}
您能解释一下为什么需要这些数据类吗?您要求它们具有(或不具有)什么行为?我需要通过“==”运算符比较两个对象。比较行为因类的类型不同而有所不同-数据或非数据。=
只需调用equals()
方法-该方法在Any
中提供(这样每个对象仅与自身相等),但在许多其他类中被重写(不仅仅是数据类
es)实施例如基于内容的平等。因此,检查类是否重写equals()
,可能更有意义。或者,您可以使用相同的参数创建该类的两个独立实例,并查看它们是否为=
。我的数据类经常修改,无论何时更改equals
方法都非常烦人。用数据类填充我的类并用“==”进行比较更简单。但是一些开发人员可能会忘记这个规则,而将非数据类添加到模型中。所以,我需要基于反射的方法来检查数据类,若违反了规则,则在构建期间中断项目的编译。