diff --git a/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AspectJBeanFactoryInitializationAotProcessorTests.java b/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AspectJBeanFactoryInitializationAotProcessorTests.java index a9bc36d97d52..6ab88d29fb33 100644 --- a/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AspectJBeanFactoryInitializationAotProcessorTests.java +++ b/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AspectJBeanFactoryInitializationAotProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ void shouldSkipEmptyClass() { @Test void shouldProcessAspect() { process(TestAspect.class); - assertThat(RuntimeHintsPredicates.reflection().onMethod(TestAspect.class, "alterReturnValue").invoke()) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(TestAspect.class, "alterReturnValue")) .accepts(this.generationContext.getRuntimeHints()); } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanRegistrationAotContributionTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanRegistrationAotContributionTests.java index 0e38a02da29c..017074e50240 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanRegistrationAotContributionTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanRegistrationAotContributionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -94,7 +94,7 @@ void contributeWhenPrivateFieldInjectionInjectsUsingReflection() { RegisteredBean registeredBean = getAndApplyContribution( PrivateFieldInjectionSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PrivateFieldInjectionSample.class, "environment")) + .onType(PrivateFieldInjectionSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PrivateFieldInjectionSample instance = new PrivateFieldInjectionSample(); @@ -113,7 +113,7 @@ void contributeWhenPackagePrivateFieldInjectionInjectsUsingConsumer() { RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateFieldInjectionSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PackagePrivateFieldInjectionSample.class, "environment")) + .onType(PackagePrivateFieldInjectionSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateFieldInjectionSample instance = new PackagePrivateFieldInjectionSample(); @@ -132,7 +132,7 @@ void contributeWhenPackagePrivateFieldInjectionOnParentClassInjectsUsingReflecti RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateFieldInjectionFromParentSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PackagePrivateFieldInjectionSample.class, "environment")) + .onType(PackagePrivateFieldInjectionSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateFieldInjectionFromParentSample instance = new PackagePrivateFieldInjectionFromParentSample(); @@ -150,7 +150,7 @@ void contributeWhenPrivateMethodInjectionInjectsUsingReflection() { RegisteredBean registeredBean = getAndApplyContribution( PrivateMethodInjectionSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PrivateMethodInjectionSample.class, "setTestBean").invoke()) + .onMethodInvocation(PrivateMethodInjectionSample.class, "setTestBean")) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PrivateMethodInjectionSample instance = new PrivateMethodInjectionSample(); @@ -169,7 +169,7 @@ void contributeWhenPackagePrivateMethodInjectionInjectsUsingConsumer() { RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateMethodInjectionSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PackagePrivateMethodInjectionSample.class, "setTestBean").introspect()) + .onType(PackagePrivateMethodInjectionSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateMethodInjectionSample instance = new PackagePrivateMethodInjectionSample(); @@ -188,7 +188,7 @@ void contributeWhenPackagePrivateMethodInjectionOnParentClassInjectsUsingReflect RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateMethodInjectionFromParentSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PackagePrivateMethodInjectionSample.class, "setTestBean")) + .onMethodInvocation(PackagePrivateMethodInjectionSample.class, "setTestBean")) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateMethodInjectionFromParentSample instance = new PackagePrivateMethodInjectionFromParentSample(); diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGeneratorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGeneratorTests.java index 0a2f316b5a50..84e2dab7ed97 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGeneratorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -568,7 +568,7 @@ private void assertReflectionOnPublisher() { private void assertHasMethodInvokeHints(Class beanType, String... methodNames) { assertThat(methodNames).allMatch(methodName -> RuntimeHintsPredicates.reflection() - .onMethod(beanType, methodName).invoke() + .onMethodInvocation(beanType, methodName) .test(this.generationContext.getRuntimeHints())); } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanRegistrationAotContributionTests.java b/spring-context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanRegistrationAotContributionTests.java index 7f4e591bc4f4..0356e01ae23f 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanRegistrationAotContributionTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/CommonAnnotationBeanRegistrationAotContributionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -79,7 +79,7 @@ void contributeWhenPrivateFieldInjectionInjectsUsingReflection() { RegisteredBean registeredBean = getAndApplyContribution( PrivateFieldResourceSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PrivateFieldResourceSample.class, "one")) + .onType(PrivateFieldResourceSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PrivateFieldResourceSample instance = new PrivateFieldResourceSample(); @@ -98,7 +98,7 @@ void contributeWhenPackagePrivateFieldInjectionInjectsUsingFieldAssignement() { RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateFieldResourceSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PackagePrivateFieldResourceSample.class, "one")) + .onType(PackagePrivateFieldResourceSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateFieldResourceSample instance = new PackagePrivateFieldResourceSample(); @@ -117,7 +117,7 @@ void contributeWhenPackagePrivateFieldInjectionOnParentClassInjectsUsingReflecti RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateFieldResourceFromParentSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onField(PackagePrivateFieldResourceSample.class, "one")) + .onType(PackagePrivateFieldResourceSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateFieldResourceFromParentSample instance = new PackagePrivateFieldResourceFromParentSample(); @@ -135,7 +135,7 @@ void contributeWhenPrivateMethodInjectionInjectsUsingReflection() { RegisteredBean registeredBean = getAndApplyContribution( PrivateMethodResourceSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PrivateMethodResourceSample.class, "setOne").invoke()) + .onMethodInvocation(PrivateMethodResourceSample.class, "setOne")) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PrivateMethodResourceSample instance = new PrivateMethodResourceSample(); @@ -153,7 +153,7 @@ void contributeWhenPrivateMethodInjectionWithCustomNameInjectsUsingReflection() RegisteredBean registeredBean = getAndApplyContribution( PrivateMethodResourceWithCustomNameSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PrivateMethodResourceWithCustomNameSample.class, "setText").invoke()) + .onMethodInvocation(PrivateMethodResourceWithCustomNameSample.class, "setText")) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PrivateMethodResourceWithCustomNameSample instance = new PrivateMethodResourceWithCustomNameSample(); @@ -172,7 +172,7 @@ void contributeWhenPackagePrivateMethodInjectionInjectsUsingMethodInvocation() { RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateMethodResourceSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PackagePrivateMethodResourceSample.class, "setOne").introspect()) + .onType(PackagePrivateMethodResourceSample.class)) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateMethodResourceSample instance = new PackagePrivateMethodResourceSample(); @@ -191,7 +191,7 @@ void contributeWhenPackagePrivateMethodInjectionOnParentClassInjectsUsingReflect RegisteredBean registeredBean = getAndApplyContribution( PackagePrivateMethodResourceFromParentSample.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(PackagePrivateMethodResourceSample.class, "setOne")) + .onMethodInvocation(PackagePrivateMethodResourceSample.class, "setOne")) .accepts(this.generationContext.getRuntimeHints()); compile(registeredBean, (postProcessor, compiled) -> { PackagePrivateMethodResourceFromParentSample instance = new PackagePrivateMethodResourceFromParentSample(); diff --git a/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java b/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java index b2da6f1c7bac..e1cffd8c7e3c 100644 --- a/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java +++ b/spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package org.springframework.context.aot; import java.io.IOException; -import java.lang.reflect.Constructor; import java.lang.reflect.Proxy; import java.util.List; import java.util.function.BiConsumer; @@ -565,8 +564,7 @@ void processAheadOfTimeWhenHasCglibProxyWithArgumentsRegisterIntrospectionHintsO GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.registerBean(ConfigurableCglibConfiguration.class); TestGenerationContext generationContext = processAheadOfTime(applicationContext); - Constructor userConstructor = ConfigurableCglibConfiguration.class.getDeclaredConstructors()[0]; - assertThat(RuntimeHintsPredicates.reflection().onConstructor(userConstructor).introspect()) + assertThat(RuntimeHintsPredicates.reflection().onType(ConfigurableCglibConfiguration.class)) .accepts(generationContext.getRuntimeHints()); } diff --git a/spring-context/src/test/java/org/springframework/context/aot/ReflectiveProcessorBeanFactoryInitializationAotProcessorTests.java b/spring-context/src/test/java/org/springframework/context/aot/ReflectiveProcessorBeanFactoryInitializationAotProcessorTests.java index dedaa501ce16..22f61e1c4f9f 100644 --- a/spring-context/src/test/java/org/springframework/context/aot/ReflectiveProcessorBeanFactoryInitializationAotProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/aot/ReflectiveProcessorBeanFactoryInitializationAotProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,6 @@ package org.springframework.context.aot; -import java.lang.reflect.Constructor; - import org.junit.jupiter.api.Test; import org.springframework.aot.generate.GenerationContext; @@ -69,8 +67,7 @@ void shouldProcessAnnotationOnType() { void shouldProcessAllBeans() throws NoSuchMethodException { ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); process(SampleTypeAnnotatedBean.class, SampleConstructorAnnotatedBean.class); - Constructor constructor = SampleConstructorAnnotatedBean.class.getDeclaredConstructor(String.class); - assertThat(reflection.onType(SampleTypeAnnotatedBean.class).and(reflection.onConstructor(constructor))) + assertThat(reflection.onType(SampleTypeAnnotatedBean.class)) .accepts(this.generationContext.getRuntimeHints()); } diff --git a/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java b/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java index e81479205889..4e6864df5094 100644 --- a/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java +++ b/spring-core-test/src/main/java/org/springframework/aot/agent/InstrumentedMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -179,8 +179,7 @@ enum InstrumentedMethod { if (field == null) { return runtimeHints -> false; } - return reflection().onType(field.getDeclaringClass()) - .or(reflection().onField(field)); + return reflection().onType(field.getDeclaringClass()); }), /** @@ -232,25 +231,25 @@ enum InstrumentedMethod { * {@link Constructor#newInstance(Object...)}. */ CONSTRUCTOR_NEWINSTANCE(Constructor.class, "newInstance", HintType.REFLECTION, - invocation -> reflection().onConstructor(invocation.getInstance()).invoke()), + invocation -> reflection().onConstructorInvocation(invocation.getInstance())), /** * {@link Method#invoke(Object, Object...)}. */ METHOD_INVOKE(Method.class, "invoke", HintType.REFLECTION, - invocation -> reflection().onMethod(invocation.getInstance()).invoke()), + invocation -> reflection().onMethodInvocation(invocation.getInstance())), /** * {@link Field#get(Object)}. */ FIELD_GET(Field.class, "get", HintType.REFLECTION, - invocation -> reflection().onField(invocation.getInstance())), + invocation -> reflection().onFieldInvocation(invocation.getInstance())), /** * {@link Field#set(Object, Object)}. */ FIELD_SET(Field.class, "set", HintType.REFLECTION, - invocation -> reflection().onField(invocation.getInstance())), + invocation -> reflection().onFieldInvocation(invocation.getInstance())), /* diff --git a/spring-core/src/main/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicates.java b/spring-core/src/main/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicates.java index 47dc61429f8d..debc13244366 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicates.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicates.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,24 +81,52 @@ public TypeHintPredicate onType(Class type) { *

The returned type exposes additional methods that refine the predicate behavior. * @param constructor the constructor * @return the {@link RuntimeHints} predicate + * @deprecated since 7.0 in favor of {@link #onConstructorInvocation(Constructor)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public ConstructorHintPredicate onConstructor(Constructor constructor) { Assert.notNull(constructor, "'constructor' must not be null"); return new ConstructorHintPredicate(constructor); } + /** + * Return a predicate that checks whether an invocation hint is registered for the given constructor. + * @param constructor the constructor + * @return the {@link RuntimeHints} predicate + * @since 7.0 + */ + public Predicate onConstructorInvocation(Constructor constructor) { + Assert.notNull(constructor, "'constructor' must not be null"); + return new ConstructorHintPredicate(constructor).invoke(); + } + /** * Return a predicate that checks whether a reflection hint is registered for the given method. * By default, both introspection and invocation hints match. *

The returned type exposes additional methods that refine the predicate behavior. * @param method the method * @return the {@link RuntimeHints} predicate + * @deprecated since 7.0 in favor of {@link #onMethodInvocation(Method)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public MethodHintPredicate onMethod(Method method) { Assert.notNull(method, "'method' must not be null"); return new MethodHintPredicate(method); } + /** + * Return a predicate that checks whether an invocation hint is registered for the given method. + * @param method the method + * @return the {@link RuntimeHints} predicate + * @since 7.0 + */ + public Predicate onMethodInvocation(Method method) { + Assert.notNull(method, "'method' must not be null"); + return new MethodHintPredicate(method).invoke(); + } + /** * Return a predicate that checks whether a reflection hint is registered for the method that matches the given selector. * This looks up a method on the given type with the expected name, if unique. @@ -108,13 +136,31 @@ public MethodHintPredicate onMethod(Method method) { * @param methodName the method name * @return the {@link RuntimeHints} predicate * @throws IllegalArgumentException if the method cannot be found or if multiple methods are found with the same name. + * @deprecated since 7.0 in favor of {@link #onMethodInvocation(Class, String)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public MethodHintPredicate onMethod(Class type, String methodName) { Assert.notNull(type, "'type' must not be null"); Assert.hasText(methodName, "'methodName' must not be empty"); return new MethodHintPredicate(getMethod(type, methodName)); } + /** + * Return a predicate that checks whether an invocation hint is registered for the method that matches the given selector. + * This looks up a method on the given type with the expected name, if unique. + * @param type the type holding the method + * @param methodName the method name + * @return the {@link RuntimeHints} predicate + * @throws IllegalArgumentException if the method cannot be found or if multiple methods are found with the same name. + * @since 7.0 + */ + public Predicate onMethodInvocation(Class type, String methodName) { + Assert.notNull(type, "'type' must not be null"); + Assert.hasText(methodName, "'methodName' must not be empty"); + return new MethodHintPredicate(getMethod(type, methodName)).invoke(); + } + /** * Return a predicate that checks whether a reflection hint is registered for the method that matches the given selector. * This looks up a method on the given type with the expected name, if unique. @@ -125,13 +171,32 @@ public MethodHintPredicate onMethod(Class type, String methodName) { * @return the {@link RuntimeHints} predicate * @throws ClassNotFoundException if the class cannot be resolved. * @throws IllegalArgumentException if the method cannot be found or if multiple methods are found with the same name. + * @deprecated since 7.0 in favor of {@link #onMethodInvocation(String, String)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public MethodHintPredicate onMethod(String className, String methodName) throws ClassNotFoundException { Assert.hasText(className, "'className' must not be empty"); Assert.hasText(methodName, "'methodName' must not be empty"); return onMethod(Class.forName(className), methodName); } + /** + * Return a predicate that checks whether an invocation hint is registered for the method that matches the given selector. + * This looks up a method on the given type with the expected name, if unique. + * @param className the name of the class holding the method + * @param methodName the method name + * @return the {@link RuntimeHints} predicate + * @throws ClassNotFoundException if the class cannot be resolved. + * @throws IllegalArgumentException if the method cannot be found or if multiple methods are found with the same name. + * @since 7.0 + */ + public Predicate onMethodInvocation(String className, String methodName) throws ClassNotFoundException { + Assert.hasText(className, "'className' must not be empty"); + Assert.hasText(methodName, "'methodName' must not be empty"); + return onMethod(Class.forName(className), methodName).invoke(); + } + private Method getMethod(Class type, String methodName) { ReflectionUtils.MethodFilter selector = method -> methodName.equals(method.getName()); Set methods = MethodIntrospector.selectMethods(type, selector); @@ -155,7 +220,10 @@ else if (methods.size() > 1) { * @param fieldName the field name * @return the {@link RuntimeHints} predicate * @throws IllegalArgumentException if a field cannot be found with the given name. + * @deprecated since 7.0 in favor of {@link #onFieldInvocation(Class, String)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public FieldHintPredicate onField(Class type, String fieldName) { Assert.notNull(type, "'type' must not be null"); Assert.hasText(fieldName, "'fieldName' must not be empty"); @@ -166,6 +234,25 @@ public FieldHintPredicate onField(Class type, String fieldName) { return new FieldHintPredicate(field); } + /** + * Return a predicate that checks whether an invocation hint is registered for the field that matches the given selector. + * This looks up a field on the given type with the expected name, if present. + * @param type the type holding the field + * @param fieldName the field name + * @return the {@link RuntimeHints} predicate + * @throws IllegalArgumentException if a field cannot be found with the given name. + * @since 7.0 + */ + public Predicate onFieldInvocation(Class type, String fieldName) { + Assert.notNull(type, "'type' must not be null"); + Assert.hasText(fieldName, "'fieldName' must not be empty"); + Field field = ReflectionUtils.findField(type, fieldName); + if (field == null) { + throw new IllegalArgumentException("No field named '%s' on class %s".formatted(fieldName, type.getName())); + } + return new FieldHintPredicate(field).invocation(); + } + /** * Return a predicate that checks whether a reflection hint is registered for the field that matches the given selector. * This looks up a field on the given type with the expected name, if present. @@ -176,25 +263,58 @@ public FieldHintPredicate onField(Class type, String fieldName) { * @return the {@link RuntimeHints} predicate * @throws ClassNotFoundException if the class cannot be resolved. * @throws IllegalArgumentException if a field cannot be found with the given name. + * @deprecated since 7.0 in favor of {@link #onFieldInvocation(String, String)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public FieldHintPredicate onField(String className, String fieldName) throws ClassNotFoundException { Assert.hasText(className, "'className' must not be empty"); Assert.hasText(fieldName, "'fieldName' must not be empty"); return onField(Class.forName(className), fieldName); } + /** + * Return a predicate that checks whether an invocation hint is registered for the field that matches the given selector. + * This looks up a field on the given type with the expected name, if present. + * @param className the name of the class holding the field + * @param fieldName the field name + * @return the {@link RuntimeHints} predicate + * @throws ClassNotFoundException if the class cannot be resolved. + * @throws IllegalArgumentException if a field cannot be found with the given name. + * @since 7.0 + */ + public Predicate onFieldInvocation(String className, String fieldName) throws ClassNotFoundException { + Assert.hasText(className, "'className' must not be empty"); + Assert.hasText(fieldName, "'fieldName' must not be empty"); + return onField(Class.forName(className), fieldName).invocation(); + } + /** * Return a predicate that checks whether a reflection hint is registered for the given field. * By default, unsafe or write access is not considered. *

The returned type exposes additional methods that refine the predicate behavior. * @param field the field * @return the {@link RuntimeHints} predicate + * @deprecated since 7.0 in favor of {@link #onFieldInvocation(Field)} + * or {@link #onType(Class)}. */ + @Deprecated(since = "7.0", forRemoval = true) public FieldHintPredicate onField(Field field) { Assert.notNull(field, "'field' must not be null"); return new FieldHintPredicate(field); } + /** + * Return a predicate that checks whether an invocation hint is registered for the given field. + * @param field the field + * @return the {@link RuntimeHints} predicate + * @since 7.0 + */ + public Predicate onFieldInvocation(Field field) { + Assert.notNull(field, "'field' must not be null"); + return new FieldHintPredicate(field).invocation(); + } + public static class TypeHintPredicate implements Predicate { diff --git a/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java index 24498581ecd2..ddae91227f24 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -254,7 +254,7 @@ void registerTypeForSerializationWithRecord() { @Test void registerTypeForSerializationWithRecordWithProperty() { bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleRecordWithProperty.class); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleRecordWithProperty.class, "getNameProperty")) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleRecordWithProperty.class, "getNameProperty")) .accepts(this.hints); } @@ -267,18 +267,18 @@ void registerTypeForSerializationWithAnonymousClass() { @Test void registerTypeForJacksonAnnotations() { bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleClassWithJsonProperty.class); - assertThat(RuntimeHintsPredicates.reflection().onField(SampleClassWithJsonProperty.class, "privateField")) + assertThat(RuntimeHintsPredicates.reflection().onFieldInvocation(SampleClassWithJsonProperty.class, "privateField")) .accepts(this.hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleClassWithJsonProperty.class, "packagePrivateMethod").invoke()) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleClassWithJsonProperty.class, "packagePrivateMethod")) .accepts(this.hints); } @Test void registerTypeForInheritedJacksonAnnotations() { bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleClassWithInheritedJsonProperty.class); - assertThat(RuntimeHintsPredicates.reflection().onField(SampleClassWithJsonProperty.class, "privateField")) + assertThat(RuntimeHintsPredicates.reflection().onFieldInvocation(SampleClassWithJsonProperty.class, "privateField")) .accepts(this.hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleClassWithJsonProperty.class, "packagePrivateMethod").invoke()) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleClassWithJsonProperty.class, "packagePrivateMethod")) .accepts(this.hints); } diff --git a/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java index 5bc8f852fe5c..9ea7122ed022 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -152,7 +152,7 @@ void shouldProcessDifferentAnnotationsOnTypeAndField() { void shouldInvokeCustomProcessor() { process(SampleCustomProcessor.class); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(SampleCustomProcessor.class, "managed")).accepts(this.runtimeHints); + .onMethodInvocation(SampleCustomProcessor.class, "managed")).accepts(this.runtimeHints); assertThat(RuntimeHintsPredicates.reflection().onType(String.class) .withMemberCategory(MemberCategory.INVOKE_DECLARED_METHODS)).accepts(this.runtimeHints); diff --git a/spring-core/src/test/java/org/springframework/aot/hint/annotation/RegisterReflectionForBindingProcessorTests.java b/spring-core/src/test/java/org/springframework/aot/hint/annotation/RegisterReflectionForBindingProcessorTests.java index f19fdb5227d7..1d60f83f54ac 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/annotation/RegisterReflectionForBindingProcessorTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/annotation/RegisterReflectionForBindingProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ void registerReflectionForBindingOnClass() { processor.registerReflectionHints(hints.reflection(), ClassLevelAnnotatedBean.class); assertThat(RuntimeHintsPredicates.reflection().onType(SampleClassWithGetter.class)).accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(String.class)).accepts(hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleClassWithGetter.class, "getName")).accepts(hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleClassWithGetter.class, "getName")).accepts(hints); } @Test @@ -49,7 +49,7 @@ void registerReflectionForBindingOnMethod() throws NoSuchMethodException { processor.registerReflectionHints(hints.reflection(), MethodLevelAnnotatedBean.class.getMethod("method")); assertThat(RuntimeHintsPredicates.reflection().onType(SampleClassWithGetter.class)).accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(String.class)).accepts(hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleClassWithGetter.class, "getName")).accepts(hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleClassWithGetter.class, "getName")).accepts(hints); } @Test @@ -57,7 +57,7 @@ void registerReflectionForBindingOnClassItself() { processor.registerReflectionHints(hints.reflection(), SampleClassWithoutAnnotationAttribute.class); assertThat(RuntimeHintsPredicates.reflection().onType(SampleClassWithoutAnnotationAttribute.class)).accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(String.class)).accepts(hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleClassWithoutAnnotationAttribute.class, "getName")).accepts(hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleClassWithoutAnnotationAttribute.class, "getName")).accepts(hints); } @Test diff --git a/spring-core/src/test/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicatesTests.java b/spring-core/src/test/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicatesTests.java index 3ba1db988ab6..c3b800e8e050 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicatesTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/predicate/ReflectionHintsPredicatesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -156,147 +156,80 @@ void typeWithAnyMemberCategoryDoesNotMatchOtherCategory() { @Nested class ReflectionOnConstructor { - @Test - void constructorIntrospectionDoesNotMatchMissingHint() { - assertPredicateDoesNotMatch(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesTypeHint() { - runtimeHints.reflection().registerType(SampleClass.class); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesConstructorHint() { - runtimeHints.reflection().registerType(SampleClass.class, typeHint -> - typeHint.withConstructor(Collections.emptyList(), ExecutableMode.INTROSPECT)); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesIntrospectPublicConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesInvokePublicConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesIntrospectDeclaredConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - - @Test - void constructorIntrospectionMatchesInvokeDeclaredConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).introspect()); - } - @Test void constructorInvocationDoesNotMatchConstructorHint() { runtimeHints.reflection().registerType(SampleClass.class, typeHint -> typeHint. withConstructor(Collections.emptyList(), ExecutableMode.INTROSPECT)); - assertPredicateDoesNotMatch(reflection.onConstructor(publicConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(publicConstructor)); } @Test void constructorInvocationMatchesConstructorInvocationHint() { runtimeHints.reflection().registerType(SampleClass.class, typeHint -> typeHint. withConstructor(Collections.emptyList(), ExecutableMode.INVOKE)); - assertPredicateMatches(reflection.onConstructor(publicConstructor).invoke()); + assertPredicateMatches(reflection.onConstructorInvocation(publicConstructor)); } @Test void constructorInvocationDoesNotMatchIntrospectPublicConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS); - assertPredicateDoesNotMatch(reflection.onConstructor(publicConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(publicConstructor)); } @Test void constructorInvocationMatchesInvokePublicConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).invoke()); + assertPredicateMatches(reflection.onConstructorInvocation(publicConstructor)); } @Test void constructorInvocationDoesNotMatchIntrospectDeclaredConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_DECLARED_CONSTRUCTORS); - assertPredicateDoesNotMatch(reflection.onConstructor(publicConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(publicConstructor)); } @Test void constructorInvocationMatchesInvokeDeclaredConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(publicConstructor).invoke()); - } - - @Test - void privateConstructorIntrospectionMatchesTypeHint() { - runtimeHints.reflection().registerType(SampleClass.class); - assertPredicateMatches(reflection.onConstructor(privateConstructor).introspect()); - } - - @Test - void privateConstructorIntrospectionMatchesConstructorHint() { - runtimeHints.reflection().registerType(SampleClass.class, typeHint -> - typeHint.withConstructor(TypeReference.listOf(String.class), ExecutableMode.INTROSPECT)); - assertPredicateMatches(reflection.onConstructor(privateConstructor).introspect()); - } - - @Test - void privateConstructorIntrospectionMatchesIntrospectDeclaredConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(privateConstructor).introspect()); - } - - @Test - void privateConstructorIntrospectionMatchesInvokeDeclaredConstructors() { - runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(privateConstructor).introspect()); + assertPredicateMatches(reflection.onConstructorInvocation(publicConstructor)); } @Test void privateConstructorInvocationDoesNotMatchConstructorHint() { runtimeHints.reflection().registerType(SampleClass.class, typeHint -> typeHint.withConstructor(TypeReference.listOf(String.class), ExecutableMode.INTROSPECT)); - assertPredicateDoesNotMatch(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(privateConstructor)); } @Test void privateConstructorInvocationMatchesConstructorInvocationHint() { runtimeHints.reflection().registerType(SampleClass.class, typeHint -> typeHint.withConstructor(TypeReference.listOf(String.class), ExecutableMode.INVOKE)); - assertPredicateMatches(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateMatches(reflection.onConstructorInvocation(privateConstructor)); } @Test void privateConstructorInvocationDoesNotMatchIntrospectPublicConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS); - assertPredicateDoesNotMatch(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(privateConstructor)); } @Test void privateConstructorInvocationDoesNotMatchInvokePublicConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); - assertPredicateDoesNotMatch(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(privateConstructor)); } @Test void privateConstructorInvocationDoesNotMatchIntrospectDeclaredConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INTROSPECT_DECLARED_CONSTRUCTORS); - assertPredicateDoesNotMatch(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateDoesNotMatch(reflection.onConstructorInvocation(privateConstructor)); } @Test void privateConstructorInvocationMatchesInvokeDeclaredConstructors() { runtimeHints.reflection().registerType(SampleClass.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); - assertPredicateMatches(reflection.onConstructor(privateConstructor).invoke()); + assertPredicateMatches(reflection.onConstructorInvocation(privateConstructor)); } } @@ -448,7 +381,7 @@ void shouldFailForMissingField() { @Test void shouldFailForUnknownClass() { - assertThatThrownBy(() -> reflection.onField("com.example.DoesNotExist", "missingField")) + assertThatThrownBy(() -> reflection.onFieldInvocation("com.example.DoesNotExist", "missingField")) .isInstanceOf(ClassNotFoundException.class); } diff --git a/spring-core/src/test/java/org/springframework/aot/hint/support/ObjectToObjectConverterRuntimeHintsTests.java b/spring-core/src/test/java/org/springframework/aot/hint/support/ObjectToObjectConverterRuntimeHintsTests.java index af23f4802e3e..e01467e60225 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/support/ObjectToObjectConverterRuntimeHintsTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/support/ObjectToObjectConverterRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,13 +49,13 @@ void setup() { @Test void javaSqlDateHasHints() throws NoSuchMethodException { - assertThat(RuntimeHintsPredicates.reflection().onMethod(java.sql.Date.class, "toLocalDate")).accepts(this.hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(java.sql.Date.class.getMethod("valueOf", LocalDate.class))).accepts(this.hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(java.sql.Date.class, "toLocalDate")).accepts(this.hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(java.sql.Date.class.getMethod("valueOf", LocalDate.class))).accepts(this.hints); } @Test void uriHasHints() throws NoSuchMethodException { - assertThat(RuntimeHintsPredicates.reflection().onConstructor(URI.class.getConstructor(String.class))).accepts(this.hints); + assertThat(RuntimeHintsPredicates.reflection().onType(URI.class)).accepts(this.hints); } } diff --git a/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt b/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt index 000df8e09b18..40d9b3361040 100644 --- a/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt +++ b/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,14 +65,14 @@ class BindingReflectionHintsRegistrarKotlinTests { @Test fun `Register reflection hints for Kotlin data class`() { bindingRegistrar.registerReflectionHints(hints.reflection(), SampleDataClass::class.java) - 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) - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleDataClass::class.java, "isNonNullable")).accepts(hints) - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleDataClass::class.java, "isNullable")).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleDataClass::class.java, "component1")).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleDataClass::class.java, "copy")).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleDataClass::class.java, "getName")).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleDataClass::class.java, "isNonNullable")).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleDataClass::class.java, "isNullable")).accepts(hints) val copyDefault: Method = SampleDataClass::class.java.getMethod("copy\$default", SampleDataClass::class.java, String::class.java, Boolean::class.javaPrimitiveType, Boolean::class.javaObjectType, Int::class.java, Object::class.java) - assertThat(RuntimeHintsPredicates.reflection().onMethod(copyDefault)).accepts(hints) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(copyDefault)).accepts(hints) } @Test diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactoryRuntimeHintsTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactoryRuntimeHintsTests.java index 2bfb57b7670c..76853ad7b583 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactoryRuntimeHintsTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactoryRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ void setup() { @Test void embeddedDataSourceProxyTypeHasHint() throws ClassNotFoundException { assertThat(RuntimeHintsPredicates.reflection() - .onMethod("org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy", "shutdown")) + .onMethodInvocation("org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy", "shutdown")) .accepts(this.hints); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/MessageMappingReflectiveProcessorTests.java b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/MessageMappingReflectiveProcessorTests.java index 694705a4b07c..b46b2725aeb2 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/MessageMappingReflectiveProcessorTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/MessageMappingReflectiveProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -123,14 +123,14 @@ void registerReflectiveHintsForClass() { void registerReflectiveHintsForMethodWithSubscribeMapping() throws NoSuchMethodException { Method method = SampleController.class.getDeclaredMethod("handleSubscribe"); processor.registerReflectionHints(hints.reflection(), method); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleController.class, "handleSubscribe")).accepts(hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleController.class, "handleSubscribe")).accepts(hints); } @Test void registerReflectiveHintsForMethodWithMessageExceptionHandler() throws NoSuchMethodException { Method method = SampleController.class.getDeclaredMethod("handleIOException"); processor.registerReflectionHints(hints.reflection(), method); - assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleController.class, "handleIOException")).accepts(hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(SampleController.class, "handleIOException")).accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(IOException.class)).accepts(hints); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/rsocket/service/RSocketExchangeReflectiveProcessorTests.java b/spring-messaging/src/test/java/org/springframework/messaging/rsocket/service/RSocketExchangeReflectiveProcessorTests.java index 4c164202dd80..8994e20c3bcb 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/rsocket/service/RSocketExchangeReflectiveProcessorTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/rsocket/service/RSocketExchangeReflectiveProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,19 +50,19 @@ void shouldRegisterReflectionHintsForMethod() throws NoSuchMethodException { processor.registerReflectionHints(hints.reflection(), method); assertThat(reflection().onType(SampleService.class)).accepts(hints); - assertThat(reflection().onMethod(SampleService.class, "get")).accepts(hints); + assertThat(reflection().onMethodInvocation(SampleService.class, "get")).accepts(hints); assertThat(reflection().onType(Response.class)).accepts(hints); - assertThat(reflection().onMethod(Response.class, "getMessage")).accepts(hints); - assertThat(reflection().onMethod(Response.class, "setMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Response.class, "getMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Response.class, "setMessage")).accepts(hints); assertThat(reflection().onType(Request.class)).accepts(hints); - assertThat(reflection().onMethod(Request.class, "getMessage")).accepts(hints); - assertThat(reflection().onMethod(Request.class, "setMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Request.class, "getMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Request.class, "setMessage")).accepts(hints); assertThat(reflection().onType(Variable.class)).accepts(hints); - assertThat(reflection().onMethod(Variable.class, "getValue")).accepts(hints); - assertThat(reflection().onMethod(Variable.class, "setValue")).accepts(hints); + assertThat(reflection().onMethodInvocation(Variable.class, "getValue")).accepts(hints); + assertThat(reflection().onMethodInvocation(Variable.class, "setValue")).accepts(hints); assertThat(reflection().onType(Metadata.class)).accepts(hints); - assertThat(reflection().onMethod(Metadata.class, "getValue")).accepts(hints); - assertThat(reflection().onMethod(Metadata.class, "setValue")).accepts(hints); + assertThat(reflection().onMethodInvocation(Metadata.class, "getValue")).accepts(hints); + assertThat(reflection().onMethodInvocation(Metadata.class, "setValue")).accepts(hints); } diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java index 5b43a20dcd0d..3d17a76fab79 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,7 +60,7 @@ void entityManagerProxyHasHibernateHints() { @Test void entityManagerFactoryHasReflectionHints() { - assertThat(RuntimeHintsPredicates.reflection().onMethod(EntityManagerFactory.class, "getCriteriaBuilder")).accepts(this.hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(EntityManagerFactory.class, "getMetamodel")).accepts(this.hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(EntityManagerFactory.class, "getCriteriaBuilder")).accepts(this.hints); + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(EntityManagerFactory.class, "getMetamodel")).accepts(this.hints); } } diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceManagedTypesBeanRegistrationAotProcessorTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceManagedTypesBeanRegistrationAotProcessorTests.java index 3801d9ec570b..2dd772fe9702 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceManagedTypesBeanRegistrationAotProcessorTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/persistenceunit/PersistenceManagedTypesBeanRegistrationAotProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -93,7 +93,7 @@ void contributeJpaHints() { .accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(Employee.class) .withMemberCategories(MemberCategory.INVOKE_DECLARED_FIELDS)).accepts(hints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(Employee.class, "preRemove")) + assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(Employee.class, "preRemove")) .accepts(hints); assertThat(RuntimeHintsPredicates.reflection().onType(EmployeeId.class) .withMemberCategories(MemberCategory.INVOKE_DECLARED_FIELDS)).accepts(hints); diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/support/InjectionCodeGeneratorTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/support/InjectionCodeGeneratorTests.java index 5aaa30088283..c54810d44ed4 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/support/InjectionCodeGeneratorTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/support/InjectionCodeGeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -125,7 +125,7 @@ void generateCodeWhenPrivateFieldAddsHint() { Field field = ReflectionUtils.findField(bean.getClass(), "age"); createGenerator(TEST_TARGET).generateInjectionCode( field, INSTANCE_VARIABLE, CodeBlock.of("$L", 123)); - assertThat(RuntimeHintsPredicates.reflection().onField(TestBean.class, "age")) + assertThat(RuntimeHintsPredicates.reflection().onType(TestBean.class)) .accepts(this.hints); } @@ -197,7 +197,7 @@ void generateCodeWhenPrivateMethodAddsHint() { createGenerator(TEST_TARGET).generateInjectionCode( method, INSTANCE_VARIABLE, CodeBlock.of("$L", 123)); assertThat(RuntimeHintsPredicates.reflection() - .onMethod(TestBeanWithPrivateMethod.class, "setAge").invoke()).accepts(this.hints); + .onMethodInvocation(TestBeanWithPrivateMethod.class, "setAge")).accepts(this.hints); } private InjectionCodeGenerator createGenerator(ClassName target) { diff --git a/spring-test/src/test/java/org/springframework/test/context/aot/DeclarativeRuntimeHintsTests.java b/spring-test/src/test/java/org/springframework/test/context/aot/DeclarativeRuntimeHintsTests.java index e983a5fa9743..57cf1206b7e9 100644 --- a/spring-test/src/test/java/org/springframework/test/context/aot/DeclarativeRuntimeHintsTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/aot/DeclarativeRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,7 +56,7 @@ void declarativeRuntimeHints() { // @RegisterReflectionForBinding assertReflectionRegistered(SampleClassWithGetter.class); assertReflectionRegistered(String.class); - assertThat(reflection().onMethod(SampleClassWithGetter.class, "getName")).accepts(this.runtimeHints); + assertThat(reflection().onMethodInvocation(SampleClassWithGetter.class, "getName")).accepts(this.runtimeHints); // @ImportRuntimeHints assertThat(resource().forResource("org/example/config/enigma.txt")).accepts(this.runtimeHints); diff --git a/spring-test/src/test/java/org/springframework/test/context/aot/TestContextAotGeneratorIntegrationTests.java b/spring-test/src/test/java/org/springframework/test/context/aot/TestContextAotGeneratorIntegrationTests.java index e5b0bf2250c5..a71890a09cf6 100644 --- a/spring-test/src/test/java/org/springframework/test/context/aot/TestContextAotGeneratorIntegrationTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/aot/TestContextAotGeneratorIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -290,7 +290,7 @@ private static void assertRuntimeHints(RuntimeHints runtimeHints) { ).forEach(type -> assertReflectionRegistered(runtimeHints, type, INVOKE_DECLARED_CONSTRUCTORS)); // @TestBean(methodName = ) - assertThat(reflection().onMethod(GreetingServiceFactory.class, "createEnigmaGreetingService")) + assertThat(reflection().onMethodInvocation(GreetingServiceFactory.class, "createEnigmaGreetingService")) .accepts(runtimeHints); // GenericApplicationContext.preDetermineBeanTypes() should have registered proxy diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java index c094e8a0e3d2..bad57ce9c849 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ void setup() { void getterMethodsShouldHaveReflectionHints() { for (String methodName : METHOD_NAMES) { assertThat(RuntimeHintsPredicates.reflection() - .onMethod(ProblemDetail.class, methodName)).accepts(this.hints); + .onMethodInvocation(ProblemDetail.class, methodName)).accepts(this.hints); } } @@ -61,7 +61,7 @@ void getterMethodsShouldHaveReflectionHints() { void mixinShouldHaveReflectionHints() { for (String methodName : METHOD_NAMES) { assertThat(RuntimeHintsPredicates.reflection() - .onMethod(ProblemDetailJacksonXmlMixin.class, methodName)).accepts(this.hints); + .onMethodInvocation(ProblemDetailJacksonXmlMixin.class, methodName)).accepts(this.hints); } } diff --git a/spring-web/src/test/java/org/springframework/web/service/annotation/HttpExchangeReflectiveProcessorTests.java b/spring-web/src/test/java/org/springframework/web/service/annotation/HttpExchangeReflectiveProcessorTests.java index 6067104e7955..952827c0de04 100644 --- a/spring-web/src/test/java/org/springframework/web/service/annotation/HttpExchangeReflectiveProcessorTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/annotation/HttpExchangeReflectiveProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,10 +43,10 @@ void registerReflectiveHintsForMethodWithReturnValue() throws NoSuchMethodExcept Method method = SampleService.class.getDeclaredMethod("get"); processor.registerReflectionHints(hints.reflection(), method); assertThat(reflection().onType(SampleService.class)).accepts(hints); - assertThat(reflection().onMethod(SampleService.class, "get")).accepts(hints); + assertThat(reflection().onMethodInvocation(SampleService.class, "get")).accepts(hints); assertThat(reflection().onType(Response.class)).accepts(hints); - assertThat(reflection().onMethod(Response.class, "getMessage")).accepts(hints); - assertThat(reflection().onMethod(Response.class, "setMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Response.class, "getMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Response.class, "setMessage")).accepts(hints); } @Test @@ -54,10 +54,10 @@ void registerReflectiveHintsForMethodWithRequestBodyParameter() throws NoSuchMet Method method = SampleService.class.getDeclaredMethod("post", Request.class); processor.registerReflectionHints(hints.reflection(), method); assertThat(reflection().onType(SampleService.class)).accepts(hints); - assertThat(reflection().onMethod(SampleService.class, "post")).accepts(hints); + assertThat(reflection().onMethodInvocation(SampleService.class, "post")).accepts(hints); assertThat(reflection().onType(Request.class)).accepts(hints); - assertThat(reflection().onMethod(Request.class, "getMessage")).accepts(hints); - assertThat(reflection().onMethod(Request.class, "setMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Request.class, "getMessage")).accepts(hints); + assertThat(reflection().onMethodInvocation(Request.class, "setMessage")).accepts(hints); }