1515 */
1616package org .springframework .batch .core .aot ;
1717
18+ import java .lang .reflect .Method ;
1819import java .sql .Types ;
1920import java .time .Duration ;
2021import java .time .Instant ;
3334import java .util .Hashtable ;
3435import java .util .LinkedHashMap ;
3536import java .util .LinkedHashSet ;
37+ import java .util .List ;
3638import java .util .Properties ;
3739import java .util .Set ;
3840import java .util .UUID ;
4446
4547import org .springframework .aop .SpringProxy ;
4648import org .springframework .aop .framework .Advised ;
49+ import org .springframework .aot .hint .ExecutableMode ;
4750import org .springframework .aot .hint .MemberCategory ;
4851import org .springframework .aot .hint .RuntimeHints ;
4952import org .springframework .aot .hint .RuntimeHintsRegistrar ;
6265import org .springframework .batch .item .Chunk ;
6366import org .springframework .batch .item .ExecutionContext ;
6467import org .springframework .core .DecoratingProxy ;
68+ import org .springframework .util .Assert ;
69+ import org .springframework .util .ReflectionUtils ;
6570
6671/**
6772 * {@link RuntimeHintsRegistrar} for Spring Batch core module.
@@ -129,7 +134,7 @@ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
129134 .proxiedInterfaces (TypeReference .of ("org.springframework.batch.core.launch.JobOperator" ))
130135 .proxiedInterfaces (SpringProxy .class , Advised .class , DecoratingProxy .class ));
131136
132- // reflection hints
137+ // reflection hints: types
133138 hints .reflection ().registerType (Types .class , MemberCategory .DECLARED_FIELDS );
134139 hints .reflection ().registerType (JobContext .class , MemberCategory .INVOKE_PUBLIC_METHODS );
135140 hints .reflection ().registerType (StepContext .class , MemberCategory .INVOKE_PUBLIC_METHODS );
@@ -147,6 +152,15 @@ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
147152 .map (TypeReference ::of )
148153 .forEach (type -> hints .reflection ().registerType (type , MemberCategory .values ()));
149154
155+ // reflection hints: methods
156+ Method jobContextGetJobParametersMethod = ReflectionUtils .findMethod (JobContext .class , "getJobParameters" );
157+ Assert .state (jobContextGetJobParametersMethod != null , "JobContext#getJobParameters must not be null" );
158+ Method stepContextGetJobParametersMethod = ReflectionUtils .findMethod (StepContext .class , "getJobParameters" );
159+ Assert .state (stepContextGetJobParametersMethod != null , "StepContext#getJobParameters must not be null" );
160+
161+ List <Method > methods = List .of (jobContextGetJobParametersMethod , stepContextGetJobParametersMethod );
162+ methods .forEach (method -> hints .reflection ().registerMethod (method , ExecutableMode .INVOKE ));
163+
150164 // serialization hints
151165 SerializationHints serializationHints = hints .serialization ();
152166 Stream .of (LinkedHashSet .class , LinkedHashMap .class , HashSet .class , ReentrantLock .class , ConcurrentHashMap .class ,
0 commit comments