You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:01:06