Kotlin 如何确定类是数据?

Kotlin 如何确定类是数据?,kotlin,reflection,Kotlin,Reflection,我的项目中有一个数据类。将此类始终保持为“数据”非常重要,并且其所有属性也必须是数据类(或原语) 有没有办法通过编程来确定project中的某个类仍然是数据类,并且它只由数据类组成,而这些数据类都由数据类等组成?您必须使用。您可以检查KClass.isData和Class.isPrimitive方法。我想会是这样的: fun isSafe(kClass: KClass<*>): Boolean { if (!(kClass.isData || kClass.java.isPr

我的项目中有一个数据类。将此类始终保持为“数据”非常重要,并且其所有属性也必须是数据类(或原语)

有没有办法通过编程来确定project中的某个类仍然是数据类,并且它只由数据类组成,而这些数据类都由数据类等组成?

您必须使用。您可以检查
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
方法都非常烦人。用数据类填充我的类并用“==”进行比较更简单。但是一些开发人员可能会忘记这个规则,而将非数据类添加到模型中。所以,我需要基于反射的方法来检查数据类,若违反了规则,则在构建期间中断项目的编译。