Kotlin中已有对象实例,如何从其他类调用私有函数?
在Kotlin中调用类的私有函数
首先明确:toPaymentRequestHistoryEvent是OneOffPaymentService的私有函数,默认仅能在类内部访问。下面分场景说明调用方式:
1. 在OneOffPaymentService类内部调用
直接在类的其他成员函数里调用即可,私有函数在类内部完全可见:
class OneOffPaymentService( val id: String, val userId: String, val paymentDate: LocalDateTime, val type: PaymentType, val amount: BigDecimal ) { private fun toPaymentRequestHistoryEvent(): PaymentRequestHistoryEvent { return PaymentRequestHistoryEvent( id = id, userId = userId, paymentDate = paymentDate, type = type, amount = amount ) } // 类内调用示例 fun finishPayment() { val historyEvent = toPaymentRequestHistoryEvent() // 这里处理生成的事件 } }
2. 从外部类(比如WithdrawalService)调用
私有函数的设计初衷就是限制外部访问,所以常规手段无法直接调用。如果必须实现,有两种方案:
方案一:放宽函数访问权限(推荐)
把private改成internal,这样同一个模块下的WithdrawalService就能直接调用:
// 修改OneOffPaymentService里的函数权限 internal fun toPaymentRequestHistoryEvent(): PaymentRequestHistoryEvent { return PaymentRequestHistoryEvent(...) } // 在WithdrawalService中调用 class WithdrawalService { fun processRelatedWithdrawal(paymentService: OneOffPaymentService) { val event = paymentService.toPaymentRequestHistoryEvent() // 后续逻辑 } }
这是最合规的做法,毕竟私有函数被外部依赖本身就说明设计可能需要调整,放宽权限是合理的改造方向。
方案二:用反射强制调用(不推荐,仅应急用)
如果完全不能修改原类的代码,可以用Kotlin反射绕过访问限制:
import kotlin.reflect.full.declaredMemberFunctions import kotlin.reflect.jvm.isAccessible class WithdrawalService { fun retrieveHistoryEvent(paymentService: OneOffPaymentService): PaymentRequestHistoryEvent { val targetFunc = OneOffPaymentService::class.declaredMemberFunctions .firstOrNull { it.name == "toPaymentRequestHistoryEvent" } ?: error("找不到目标私有函数") targetFunc.isAccessible = true // 开启访问权限 return targetFunc.call(paymentService) as PaymentRequestHistoryEvent } }
注意:反射会破坏封装性,代码可读性和维护性都会下降,不到万不得已别用。
内容的提问来源于stack exchange,提问作者nitin sharma
相关产品推荐
相关产品推荐

