Browse Source

Refine BindingReflectionHintsRegistrar Kotlin support

Closes gh-29593
pull/29676/head
Sébastien Deleuze 3 years ago
parent
commit
b27735d4a6
  1. 4
      spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java
  2. 13
      spring-core/src/test/kotlin/org/springframework/aot/hint/KotlinBindingReflectionHintsRegistrarTests.kt

4
spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java

@ -111,6 +111,8 @@ public class BindingReflectionHintsRegistrar { @@ -111,6 +111,8 @@ public class BindingReflectionHintsRegistrar {
if (KotlinDetector.isKotlinType(clazz)) {
KotlinDelegate.registerComponentHints(hints, clazz);
registerKotlinSerializationHints(hints, clazz);
// For Kotlin reflection
typeHint.withMembers(MemberCategory.INTROSPECT_DECLARED_METHODS);
}
});
}
@ -192,7 +194,7 @@ public class BindingReflectionHintsRegistrar { @@ -192,7 +194,7 @@ public class BindingReflectionHintsRegistrar {
if (kClass.isData()) {
for (Method method : type.getMethods()) {
String methodName = method.getName();
if (methodName.startsWith("component") || methodName.equals("copy")) {
if (methodName.startsWith("component") || methodName.equals("copy") || methodName.equals("copy$default")) {
hints.registerMethod(method, ExecutableMode.INVOKE);
}
}

13
spring-core/src/test/kotlin/org/springframework/aot/hint/KotlinBindingReflectionHintsRegistrarTests.kt

@ -20,6 +20,7 @@ import org.assertj.core.api.Assertions.assertThat @@ -20,6 +20,7 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.ThrowingConsumer
import org.junit.jupiter.api.Test
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates
import java.lang.reflect.Method
/**
* Tests for Kotlin support in [BindingReflectionHintsRegistrar].
@ -67,6 +68,16 @@ class KotlinBindingReflectionHintsRegistrarTests { @@ -67,6 +68,16 @@ class KotlinBindingReflectionHintsRegistrarTests {
assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleDataClass::class.java, "component1")).accepts(hints)
assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleDataClass::class.java, "copy")).accepts(hints)
assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleDataClass::class.java, "getName")).accepts(hints)
val copyDefault: Method = SampleDataClass::class.java.getMethod("copy\$default", SampleDataClass::class.java,
String::class.java , Int::class.java, Object::class.java)
assertThat(RuntimeHintsPredicates.reflection().onMethod(copyDefault)).accepts(hints)
}
@Test
fun `Register reflection hints on declared methods for Kotlin class`() {
bindingRegistrar.registerReflectionHints(hints.reflection(), SampleClass::class.java)
assertThat(RuntimeHintsPredicates.reflection().onType(SampleClass::class.java)
.withMemberCategory(MemberCategory.INTROSPECT_DECLARED_METHODS)).accepts(hints)
}
}
@ -74,3 +85,5 @@ class KotlinBindingReflectionHintsRegistrarTests { @@ -74,3 +85,5 @@ class KotlinBindingReflectionHintsRegistrarTests {
class SampleSerializableClass(val name: String)
data class SampleDataClass(val name: String)
class SampleClass(val name: String)

Loading…
Cancel
Save