You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分Kotlin数据类自动生成方法与手动重写方法?

区分Kotlin数据类自动生成方法与手动编写方法的方案

方法一:利用Kotlin反射的isGenerated属性

Kotlin反射库为KFunction提供了isGenerated属性,数据类编译器自动生成的方法(如equals()、hashCode()、copy()、componentN(),以及未被手动重写的toString())对应的KFunction实例该属性会返回true,手动编写的方法则为false。

示例代码:

import kotlin.reflect.full.declaredMemberFunctions
import kotlin.reflect.full.isGenerated

fun main() {
    data class User(val name: String, val age: Int) {
        // 手动重写toString
        override fun toString(): String {
            return "User(name='$name')"
        }
    }

    val userClass = User::class
    userClass.declaredMemberFunctions.forEach { func ->
        println("方法名:${func.name},是否自动生成:${func.isGenerated}")
    }
}

输出中,手动重写的toString()的isGenerated为false,其余自动生成方法均为true。

方法二:通过Java反射判断isSynthetic属性

数据类自动生成的方法大多属于合成方法,可通过Java反射的Method.isSynthetic()方法判断。手动编写的方法(包括重写的toString()等)该属性返回false。

示例代码:

fun main() {
    data class User(val name: String, val age: Int) {
        override fun toString(): String {
            return "User(name='$name')"
        }
    }

    val userClass = User::class.java
    userClass.declaredMethods.forEach { method ->
        println("方法名:${method.name},是否为合成方法:${method.isSynthetic}")
    }
}

自动生成的equals、hashCode、copy、component1/component2等方法的isSynthetic均为true,手动重写的方法为false。

注意事项

  • 若需编写通用的toString()等函数,可结合上述方法过滤掉自动生成的方法,仅处理手动编写的逻辑,或在自动生成方法基础上扩展。
  • isGenerated是Kotlin反射特有的属性,需确保项目引入了Kotlin反射依赖(kotlin-reflect)。

内容的提问来源于stack exchange,提问作者Lotexiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:59:56