This is what I endup doing.
Create extension function on Any
class
fun Any.toStringByReflection(exclude: List<String> = listOf(), mask: List<String> = listOf()): String {
val propsString = this::class.memberProperties
.filter { exclude.isEmpty() || !exclude.contains(it.name) }
.joinToString(", ") {
val value = if (!mask.isEmpty() && mask.contains(it.name)) "****" else it.getter.call(this).toString()
"${it.name}=${value}"
};
return "${this::class.simpleName} [${propsString}]"
}
Then you can call this method from individual type.
override fun toString(): String {
return this.toStringByReflection()
}
It generates string below
Table [colums=[], name=pg_aggregate_fnoid_index, schema=pg_catalog, type=SYSTEM INDEX]
With name field masked:
override fun toString(): String {
return this.toStringByReflection(mask= listOf("name"))
}
It generates,
Table [colums=[], name=****, schema=pg_catalog, type=SYSTEM INDEX]