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") }


上一篇:
下一篇:
切换中文