Support Kotlin synthetic classes in MethodParameter and SpEL
Closes gh-23812
This commit is contained in:
parent
f2b3953d76
commit
7646895fd4
|
@ -908,9 +908,14 @@ public class MethodParameter {
|
|||
* functions via Kotlin reflection.
|
||||
*/
|
||||
static private Type getGenericReturnType(Method method) {
|
||||
KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method);
|
||||
if (function != null && function.isSuspend()) {
|
||||
return ReflectJvmMapping.getJavaType(function.getReturnType());
|
||||
try {
|
||||
KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method);
|
||||
if (function != null && function.isSuspend()) {
|
||||
return ReflectJvmMapping.getJavaType(function.getReturnType());
|
||||
}
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
// probably a synthetic class - let's use java reflection instead
|
||||
}
|
||||
return method.getGenericReturnType();
|
||||
}
|
||||
|
@ -920,10 +925,15 @@ public class MethodParameter {
|
|||
* functions via Kotlin reflection.
|
||||
*/
|
||||
static private Class<?> getReturnType(Method method) {
|
||||
KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method);
|
||||
if (function != null && function.isSuspend()) {
|
||||
Type paramType = ReflectJvmMapping.getJavaType(function.getReturnType());
|
||||
return ResolvableType.forType(paramType).resolve(method.getReturnType());
|
||||
try {
|
||||
KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method);
|
||||
if (function != null && function.isSuspend()) {
|
||||
Type paramType = ReflectJvmMapping.getJavaType(function.getReturnType());
|
||||
return ResolvableType.forType(paramType).resolve(method.getReturnType());
|
||||
}
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
// probably a synthetic class - let's use java reflection instead
|
||||
}
|
||||
return method.getReturnType();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
description = "Spring Expression Language (SpEL)"
|
||||
|
||||
apply plugin: "kotlin"
|
||||
|
||||
dependencies {
|
||||
compile(project(":spring-core"))
|
||||
testCompile("org.jetbrains.kotlin:kotlin-reflect")
|
||||
testCompile("org.jetbrains.kotlin:kotlin-stdlib")
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package org.springframework.expression.spel
|
||||
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.springframework.expression.ExpressionParser
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser
|
||||
|
||||
class KotlinSpelReproTests {
|
||||
|
||||
private val parser: ExpressionParser = SpelExpressionParser()
|
||||
|
||||
private val context = TestScenarioCreator.getTestEvaluationContext()
|
||||
|
||||
|
||||
@Test
|
||||
fun `gh-23812 SpEL cannot invoke Kotlin synthetic classes`() {
|
||||
val expr = parser.parseExpression("new org.springframework.expression.spel.KotlinSpelReproTests\$Config().kotlinSupplier().invoke()")
|
||||
assertThat(expr.getValue(context)).isEqualTo("test")
|
||||
}
|
||||
|
||||
class Config {
|
||||
|
||||
fun kotlinSupplier(): () -> String {
|
||||
return { "test" }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue