How about using dynamic proxies? ``` data class Se...
# announcements
v
How about using dynamic proxies?
Copy code
data class Secret(
    private val foo: String,
    private val bar: String
) 

interface SecretMirror {
  fun foo(): String

  fun bar(): String
}

fun <T> createMirror(value: Any, clazz: Class<T>): T {
  val loader = value.javaClass.classLoader
  val interfaces = arrayOf(clazz)

  return clazz.cast(Proxy.newProxyInstance(loader, interfaces) { proxy, method, args ->
    val field = value.javaClass.getDeclaredField(method.name)
    field.isAccessible = true
    field.get(value)
  })
}

fun main(args: Array<String>) {
  val secret = Secret("Hello", "Secret")
  val mirror = createMirror(secret, SecretMirror::class.java)

  println("${mirror.foo()}, ${mirror.bar()}")
}