// AppInitializer.kt
val initMethod = socketIOManagerClass.getDeclaredMethod(
"init",
Application::class.java,
kotlin.jvm.functions.Function0::class.java, // isLoggedInProvider
kotlin.coroutines.SuspendFunction0::class.java // refreshTokenProvider
)
initMethod.invoke(null, application, isLoggedInProvider, refreshTokenProvider)
SuspendFunction0 类型,反射代码复杂// SocketIOManager.kt
fun init(app: Application) {
// 只负责注册生命周期监听
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
// AppInitializer.kt
// 1. 先调用 init(注册生命周期)
val initMethod = socketIOManagerClass.getMethod("init", Application::class.java)
initMethod.invoke(null, application)
// 2. 再设置回调属性(直接设置,不需要处理 suspend 函数类型)
val isLoggedInProviderField = socketIOManagerClass.getDeclaredField("isLoggedInProvider")
isLoggedInProviderField.isAccessible = true
isLoggedInProviderField.set(null, isLoggedInProvider)
val refreshTokenProviderField = socketIOManagerClass.getDeclaredField("refreshTokenProvider")
refreshTokenProviderField.isAccessible = true
refreshTokenProviderField.set(null, refreshTokenProvider)
setAccessible(true),可能违反封装原则| 维度 | 方案1:反射调用 init | 方案2:分步设置属性 |
|---|---|---|
| 代码复杂度 | ⭐⭐⭐ 复杂(需要处理 SuspendFunction0) | ⭐⭐ 简单(直接设置属性) |
| 可读性 | ⭐⭐ 一般(反射代码不够直观) | ⭐⭐⭐ 好(分步操作清晰) |
| 类型安全 | ⭐⭐⭐ 好(编译时类型检查) | ⭐⭐ 一般(运行时设置) |
| 原子性 | ⭐⭐⭐ 好(一次调用完成) | ⭐⭐ 一般(分步操作) |
| 错误处理 | ⭐⭐ 一般(集中处理) | ⭐⭐ 一般(分散处理) |
| 灵活性 | ⭐⭐ 一般(需要重新 init) | ⭐⭐⭐ 好(可随时修改) |
| 封装性 | ⭐⭐⭐ 好(通过方法调用) | ⭐⭐ 一般(直接访问字段) |
理由:
改进建议:
setCallbacks() 方法,通过方法设置而不是直接访问字段// SocketIOManager.kt
fun init(app: Application) {
// 只负责注册生命周期监听
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
fun setCallbacks(
isLoggedInProvider: (() -> Boolean)? = null,
refreshTokenProvider: (suspend () -> String?)? = null
) {
this.isLoggedInProvider = isLoggedInProvider
this.refreshTokenProvider = refreshTokenProvider
}
// AppInitializer.kt
// 1. 先调用 init(注册生命周期)
val initMethod = socketIOManagerClass.getMethod("init", Application::class.java)
initMethod.invoke(null, application)
// 2. 再调用 setCallbacks(设置回调)
val setCallbacksMethod = socketIOManagerClass.getMethod(
"setCallbacks",
kotlin.jvm.functions.Function0::class.java, // isLoggedInProvider
kotlin.coroutines.SuspendFunction0::class.java // refreshTokenProvider
)
setCallbacksMethod.invoke(null, isLoggedInProvider, refreshTokenProvider)
优势:
缺点:
SuspendFunction0 类型(但比方案1简单,因为方法签名更清晰)当前方案(方案1)的问题:
SuspendFunction0 类型推荐改进:
最终建议: