vmironov
08/01/2016, 12:03 AMdata 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()}")
}