kotlin
interface Printer {
fun print(message: String)
}
kotlin
class ProxyPrinter(private val target: Printer) : InvocationHandler {
override fun invoke(proxy: Any, method: Method, args: Array<Any?>?): Any? {
println("Before invoking method: ${method.name}")
val result = method.invoke(target, *args.orEmpty())
println("After invoking method: ${method.name}")
return result
}
}
fun main() {
val printer = PrinterImpl()
val proxyPrinter = ProxyPrinter(printer)
val proxy = Proxy.newProxyInstance(
printer.javaClass.classLoader,
arrayOf(Printer::class.java),
proxyPrinter
) as Printer
proxy.print("Hello, Reflect!") // Method call with additional logic
}
kotlin
class Calculator {
fun add(a: Int, b: Int): Int {
return a + b
}
}
kotlin
class LoggingAspect {
fun logMethodCall(proxy: Any, method: Method, args: Array<Any?>?) {
println("Method ${method.name} called with arguments ${args?.contentToString()}")
}
fun logMethodReturn(proxy: Any, method: Method, args: Array<Any?>?, result: Any?) {
println("Method ${method.name} returned $result")
}
}
fun main() {
val calculator = Calculator()
val proxyCalculator = Proxy.newProxyInstance(
calculator.javaClass.classLoader,
arrayOf(Calculator::class.java)
) { proxy, method, args ->
val aspect = LoggingAspect()
aspect.logMethodCall(proxy, method, args)
val result = method.invoke(calculator, *args.orEmpty())
aspect.logMethodReturn(proxy, method, args, result)
result
} as Calculator
val sum = proxyCalculator.add(2, 3) // Method call with logging
println("Sum: $sum")
}