@@ -255,6 +255,7 @@ public Predicate<RuntimeHints> withAnyMemberCategory(MemberCategory... memberCat
255
255
}
256
256
257
257
258
+ @ SuppressWarnings ("removal" )
258
259
public abstract static class ExecutableHintPredicate <T extends Executable > implements Predicate <RuntimeHints > {
259
260
260
261
protected final T executable ;
@@ -299,6 +300,7 @@ static boolean includes(ExecutableHint hint, String name,
299
300
}
300
301
301
302
303
+ @ SuppressWarnings ("removal" )
302
304
public static class ConstructorHintPredicate extends ExecutableHintPredicate <Constructor <?>> {
303
305
304
306
ConstructorHintPredicate (Constructor <?> constructor ) {
@@ -308,28 +310,17 @@ public static class ConstructorHintPredicate extends ExecutableHintPredicate<Con
308
310
@ Override
309
311
public boolean test (RuntimeHints runtimeHints ) {
310
312
return (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
311
- .withAnyMemberCategory (getPublicMemberCategories ())
312
- .and (hints -> Modifier .isPublic (this .executable .getModifiers ())))
313
- .or (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ())).withAnyMemberCategory (getDeclaredMemberCategories ()))
313
+ .and (hints -> this .executableMode == ExecutableMode .INTROSPECT ))
314
+ .or (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
315
+ .withMemberCategory (MemberCategory .INVOKE_PUBLIC_CONSTRUCTORS )
316
+ .and (hints -> Modifier .isPublic (this .executable .getModifiers ()))
317
+ .and (hints -> this .executableMode == ExecutableMode .INVOKE ))
318
+ .or (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
319
+ .withMemberCategory (MemberCategory .INVOKE_DECLARED_CONSTRUCTORS )
320
+ .and (hints -> this .executableMode == ExecutableMode .INVOKE ))
314
321
.or (exactMatch ()).test (runtimeHints );
315
322
}
316
323
317
- MemberCategory [] getPublicMemberCategories () {
318
- if (this .executableMode == ExecutableMode .INTROSPECT ) {
319
- return new MemberCategory [] { MemberCategory .INTROSPECT_PUBLIC_CONSTRUCTORS ,
320
- MemberCategory .INVOKE_PUBLIC_CONSTRUCTORS };
321
- }
322
- return new MemberCategory [] { MemberCategory .INVOKE_PUBLIC_CONSTRUCTORS };
323
- }
324
-
325
- MemberCategory [] getDeclaredMemberCategories () {
326
- if (this .executableMode == ExecutableMode .INTROSPECT ) {
327
- return new MemberCategory [] { MemberCategory .INTROSPECT_DECLARED_CONSTRUCTORS ,
328
- MemberCategory .INVOKE_DECLARED_CONSTRUCTORS };
329
- }
330
- return new MemberCategory [] { MemberCategory .INVOKE_DECLARED_CONSTRUCTORS };
331
- }
332
-
333
324
@ Override
334
325
Predicate <RuntimeHints > exactMatch () {
335
326
return hints -> {
@@ -343,6 +334,7 @@ Predicate<RuntimeHints> exactMatch() {
343
334
}
344
335
345
336
337
+ @ SuppressWarnings ("removal" )
346
338
public static class MethodHintPredicate extends ExecutableHintPredicate <Method > {
347
339
348
340
MethodHintPredicate (Method method ) {
@@ -352,31 +344,18 @@ public static class MethodHintPredicate extends ExecutableHintPredicate<Method>
352
344
@ Override
353
345
public boolean test (RuntimeHints runtimeHints ) {
354
346
return (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
355
- .withAnyMemberCategory (getPublicMemberCategories ())
356
- .and (hints -> Modifier .isPublic (this .executable .getModifiers ())))
357
- .or (new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
358
- .withAnyMemberCategory (getDeclaredMemberCategories ())
359
- .and (hints -> !Modifier .isPublic (this .executable .getModifiers ())))
347
+ .and (hints -> this .executableMode == ExecutableMode .INTROSPECT ))
348
+ .or ((new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
349
+ .withMemberCategory (MemberCategory .INVOKE_PUBLIC_METHODS )
350
+ .and (hints -> Modifier .isPublic (this .executable .getModifiers ()))
351
+ .and (hints -> this .executableMode == ExecutableMode .INVOKE )))
352
+ .or ((new TypeHintPredicate (TypeReference .of (this .executable .getDeclaringClass ()))
353
+ .withMemberCategory (MemberCategory .INVOKE_DECLARED_METHODS )
354
+ .and (hints -> !Modifier .isPublic (this .executable .getModifiers ()))
355
+ .and (hints -> this .executableMode == ExecutableMode .INVOKE )))
360
356
.or (exactMatch ()).test (runtimeHints );
361
357
}
362
358
363
- MemberCategory [] getPublicMemberCategories () {
364
- if (this .executableMode == ExecutableMode .INTROSPECT ) {
365
- return new MemberCategory [] { MemberCategory .INTROSPECT_PUBLIC_METHODS ,
366
- MemberCategory .INVOKE_PUBLIC_METHODS };
367
- }
368
- return new MemberCategory [] { MemberCategory .INVOKE_PUBLIC_METHODS };
369
- }
370
-
371
- MemberCategory [] getDeclaredMemberCategories () {
372
-
373
- if (this .executableMode == ExecutableMode .INTROSPECT ) {
374
- return new MemberCategory [] { MemberCategory .INTROSPECT_DECLARED_METHODS ,
375
- MemberCategory .INVOKE_DECLARED_METHODS };
376
- }
377
- return new MemberCategory [] { MemberCategory .INVOKE_DECLARED_METHODS };
378
- }
379
-
380
359
@ Override
381
360
Predicate <RuntimeHints > exactMatch () {
382
361
return hints -> {
@@ -394,31 +373,40 @@ public static class FieldHintPredicate implements Predicate<RuntimeHints> {
394
373
395
374
private final Field field ;
396
375
376
+ @ Nullable
377
+ private ExecutableMode executableMode ;
378
+
397
379
FieldHintPredicate (Field field ) {
398
380
this .field = field ;
399
381
}
400
382
383
+ /**
384
+ * Refine the current predicate to only match if an invocation hint is registered for this field.
385
+ * @return the refined {@link RuntimeHints} predicate
386
+ * @since 7.0
387
+ */
388
+ public FieldHintPredicate invocation () {
389
+ this .executableMode = ExecutableMode .INVOKE ;
390
+ return this ;
391
+ }
392
+
401
393
@ Override
402
394
public boolean test (RuntimeHints runtimeHints ) {
403
395
TypeHint typeHint = runtimeHints .reflection ().getTypeHint (this .field .getDeclaringClass ());
404
- if (typeHint == null ) {
405
- return false ;
406
- }
407
- return memberCategoryMatch (typeHint ) || exactMatch (typeHint );
408
- }
409
-
410
- private boolean memberCategoryMatch (TypeHint typeHint ) {
411
- if (Modifier .isPublic (this .field .getModifiers ())) {
412
- return typeHint .getMemberCategories ().contains (MemberCategory .PUBLIC_FIELDS );
396
+ if (typeHint != null ) {
397
+ if (this .executableMode == ExecutableMode .INVOKE ) {
398
+ if (Modifier .isPublic (this .field .getModifiers ())) {
399
+ return typeHint .getMemberCategories ().contains (MemberCategory .INVOKE_PUBLIC_FIELDS );
400
+ }
401
+ else {
402
+ return typeHint .getMemberCategories ().contains (MemberCategory .INVOKE_DECLARED_FIELDS );
403
+ }
404
+ }
405
+ else {
406
+ return true ;
407
+ }
413
408
}
414
- else {
415
- return typeHint .getMemberCategories ().contains (MemberCategory .DECLARED_FIELDS );
416
- }
417
- }
418
-
419
- private boolean exactMatch (TypeHint typeHint ) {
420
- return typeHint .fields ().anyMatch (fieldHint ->
421
- this .field .getName ().equals (fieldHint .getName ()));
409
+ return false ;
422
410
}
423
411
}
424
412
0 commit comments