Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit 68d4b52

Browse files
committed
トップレベル関数だった場合に高速呼び出しできるように対応
1 parent c72e933 commit 68d4b52

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/main/kotlin/com/mapk/fastkfunction/FastKFunction.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,20 @@ class FastKFunction<T>(private val function: KFunction<T>, instance: Any? = null
9090
getInstanceMethodCall(method, instance)
9191
}
9292
} else {
93-
try {
94-
// 定義先がobjectであればインスタンスを利用した呼び出しを行い、そうでなければ普通に呼び出す
95-
method.declaringObject
96-
?.let { instanceFromClass -> getInstanceMethodCall(method, instanceFromClass) }
97-
?: getFunctionCall(function)
98-
} catch (e: UnsupportedOperationException) {
99-
// トップレベル関数でobjectInstanceを取得しようとするとUnsupportedOperationExceptionになるためtryする
100-
getFunctionCall(function)
93+
// staticメソッドかつ引数の数がKFunctionの引数の数と変わらない場合はトップレベル関数(= 実体はstatic関数)
94+
if (Modifier.isStatic(method.modifiers) && parameters.size == method.parameters.size) {
95+
@Suppress("UNCHECKED_CAST")
96+
{ method.invoke(null, *it) as T }
97+
} else {
98+
try {
99+
// 定義先がobjectであればインスタンスを利用した呼び出しを行い、そうでなければ普通に呼び出す
100+
method.declaringObject
101+
?.let { instanceFromClass -> getInstanceMethodCall(method, instanceFromClass) }
102+
?: getFunctionCall(function)
103+
} catch (e: UnsupportedOperationException) {
104+
// トップレベル関数でobjectInstanceを取得しようとするとUnsupportedOperationExceptionになるためtryする
105+
getFunctionCall(function)
106+
}
101107
}
102108
}
103109
}

0 commit comments

Comments
 (0)