14
14
import java .util .ArrayList ;
15
15
import java .util .Arrays ;
16
16
import java .util .Collections ;
17
- import java .util .Iterator ;
18
17
import java .util .List ;
19
18
import java .util .Map ;
20
19
import java .util .concurrent .Callable ;
@@ -281,13 +280,13 @@ public ReflectionOptimizer getReflectionOptimizer(
281
280
}
282
281
}
283
282
284
- private static class ForeignPackageClassInfo {
283
+ private static class BridgeMembersClassInfo {
285
284
final Class <?> clazz ;
286
285
final List <String > propertyNames = new ArrayList <>();
287
286
final List <Member > getters = new ArrayList <>();
288
287
final List <Member > setters = new ArrayList <>();
289
288
290
- public ForeignPackageClassInfo (Class <?> clazz ) {
289
+ public BridgeMembersClassInfo (Class <?> clazz ) {
291
290
this .clazz = clazz ;
292
291
}
293
292
}
@@ -296,99 +295,81 @@ private Class<?> determineAccessOptimizerSuperClass(Class<?> clazz, String[] pro
296
295
if ( clazz .isInterface () ) {
297
296
return Object .class ;
298
297
}
299
- // generate access optimizer super classes for foreign package super classes that declare fields
298
+ // generate access optimizer super classes for super classes that declare members requiring bridge methods
300
299
// each should declare protected static methods get_FIELDNAME(OWNER)/set_FIELDNAME(OWNER, TYPE)
301
300
// which should be called then from within GetPropertyValues/SetPropertyValues
302
301
// Since these super classes will be in the correct package, the package-private entity field access is fine
303
- final List <ForeignPackageClassInfo > foreignPackageClassInfos = createForeignPackageClassInfos ( clazz );
304
- for ( Iterator <ForeignPackageClassInfo > iterator = foreignPackageClassInfos .iterator (); iterator .hasNext (); ) {
305
- final ForeignPackageClassInfo foreignPackageClassInfo = iterator .next ();
306
- for ( int i = 0 ; i < getters .length ; i ++ ) {
307
- final Member getter = getters [i ];
308
- final Member setter = setters [i ];
309
- boolean found = false ;
310
- if ( getter .getDeclaringClass () == foreignPackageClassInfo .clazz && !Modifier .isPublic ( getter .getModifiers () ) ) {
311
- foreignPackageClassInfo .getters .add ( getter );
312
- found = true ;
313
- }
314
- if ( setter .getDeclaringClass () == foreignPackageClassInfo .clazz && !Modifier .isPublic ( setter .getModifiers () ) ) {
315
- foreignPackageClassInfo .setters .add ( setter );
316
- found = true ;
317
- }
318
- if ( found ) {
319
- foreignPackageClassInfo .propertyNames .add ( propertyNames [i ] );
320
- }
321
- }
322
- if ( foreignPackageClassInfo .getters .isEmpty () && foreignPackageClassInfo .setters .isEmpty () ) {
323
- iterator .remove ();
324
- }
325
- }
302
+ final List <BridgeMembersClassInfo > bridgeMembersClassInfos = createBridgeMembersClassInfos ( clazz , getters , setters , propertyNames );
326
303
327
304
Class <?> superClass = Object .class ;
328
- for ( int i = foreignPackageClassInfos .size () - 1 ; i >= 0 ; i -- ) {
329
- final ForeignPackageClassInfo foreignPackageClassInfo = foreignPackageClassInfos .get ( i );
305
+ for ( int i = bridgeMembersClassInfos .size () - 1 ; i >= 0 ; i -- ) {
306
+ final BridgeMembersClassInfo bridgeMembersClassInfo = bridgeMembersClassInfos .get ( i );
330
307
final Class <?> newSuperClass = superClass ;
331
308
332
- final String className = foreignPackageClassInfo .clazz .getName () + "$" + OPTIMIZER_PROXY_BRIDGE_NAMING_SUFFIX + encodeName ( foreignPackageClassInfo .propertyNames , foreignPackageClassInfo .getters , foreignPackageClassInfo .setters );
309
+ final String className = bridgeMembersClassInfo .clazz .getName () + "$" + OPTIMIZER_PROXY_BRIDGE_NAMING_SUFFIX + encodeName ( bridgeMembersClassInfo .propertyNames , bridgeMembersClassInfo .getters , bridgeMembersClassInfo .setters );
333
310
superClass = byteBuddyState .load (
334
- foreignPackageClassInfo .clazz ,
311
+ bridgeMembersClassInfo .clazz ,
335
312
className ,
336
313
(byteBuddy , namingStrategy ) -> {
337
314
DynamicType .Builder <?> builder = byteBuddy .with ( namingStrategy ).subclass ( newSuperClass );
338
- for ( Member getter : foreignPackageClassInfo .getters ) {
339
- final Class <?> getterType ;
340
- if ( getter instanceof Field field ) {
341
- getterType = field .getType ();
342
- }
343
- else if ( getter instanceof Method method ) {
344
- getterType = method .getReturnType ();
345
- }
315
+ for ( Member getter : bridgeMembersClassInfo .getters ) {
316
+ if ( !Modifier .isPublic ( getter .getModifiers () ) ) {
317
+ final Class <?> getterType ;
318
+ if ( getter instanceof Field field ) {
319
+ getterType = field .getType ();
320
+ }
321
+ else if ( getter instanceof Method method ) {
322
+ getterType = method .getReturnType ();
323
+ }
346
324
else {
347
325
throw new AssertionFailure ( "Unexpected member" + getter );
348
326
}
349
327
350
- builder = builder .defineMethod (
351
- "get_" + getter .getName (),
352
- TypeDescription .Generic .OfNonGenericType .ForLoadedType .of (
353
- getterType
354
- ),
355
- Opcodes .ACC_PROTECTED | Opcodes .ACC_STATIC
356
- )
357
- .withParameter ( foreignPackageClassInfo .clazz )
358
- .intercept (
359
- new Implementation .Simple (
360
- new GetFieldOnArgument (
361
- getter
362
- )
363
- )
364
- );
365
- }
366
- for ( Member setter : foreignPackageClassInfo .setters ) {
367
- final Class <?> setterType ;
368
- if ( setter instanceof Field field ) {
369
- setterType = field .getType ();
370
- }
371
- else if ( setter instanceof Method method ) {
372
- setterType = method .getParameterTypes ()[0 ];
328
+ builder = builder .defineMethod (
329
+ "get_" + getter .getName (),
330
+ TypeDescription .Generic .OfNonGenericType .ForLoadedType .of (
331
+ getterType
332
+ ),
333
+ Opcodes .ACC_PROTECTED | Opcodes .ACC_STATIC
334
+ )
335
+ .withParameter ( bridgeMembersClassInfo .clazz )
336
+ .intercept (
337
+ new Implementation .Simple (
338
+ new GetFieldOnArgument (
339
+ getter
340
+ )
341
+ )
342
+ );
373
343
}
344
+ }
345
+ for ( Member setter : bridgeMembersClassInfo .setters ) {
346
+ if ( !Modifier .isPublic ( setter .getModifiers () ) ) {
347
+ final Class <?> setterType ;
348
+ if ( setter instanceof Field field ) {
349
+ setterType = field .getType ();
350
+ }
351
+ else if ( setter instanceof Method method ) {
352
+ setterType = method .getParameterTypes ()[0 ];
353
+ }
374
354
else {
375
355
throw new AssertionFailure ( "Unexpected member" + setter );
376
356
}
377
357
378
- builder = builder .defineMethod (
379
- "set_" + setter .getName (),
380
- TypeDescription .Generic .VOID ,
381
- Opcodes .ACC_PROTECTED | Opcodes .ACC_STATIC
382
- )
383
- .withParameter ( foreignPackageClassInfo .clazz )
384
- .withParameter ( setterType )
385
- .intercept (
386
- new Implementation .Simple (
387
- new SetFieldOnArgument (
388
- setter
389
- )
390
- )
391
- );
358
+ builder = builder .defineMethod (
359
+ "set_" + setter .getName (),
360
+ TypeDescription .Generic .VOID ,
361
+ Opcodes .ACC_PROTECTED | Opcodes .ACC_STATIC
362
+ )
363
+ .withParameter ( bridgeMembersClassInfo .clazz )
364
+ .withParameter ( setterType )
365
+ .intercept (
366
+ new Implementation .Simple (
367
+ new SetFieldOnArgument (
368
+ setter
369
+ )
370
+ )
371
+ );
372
+ }
392
373
}
393
374
394
375
return builder ;
@@ -398,10 +379,10 @@ else if ( setter instanceof Method method ) {
398
379
for ( int j = 0 ; j < getters .length ; j ++ ) {
399
380
final Member getter = getters [j ];
400
381
final Member setter = setters [j ];
401
- if ( foreignPackageClassInfo .getters .contains ( getter ) ) {
382
+ if ( bridgeMembersClassInfo .getters .contains ( getter ) && ! Modifier . isPublic ( getter . getModifiers () ) ) {
402
383
getters [j ] = new ForeignPackageMember ( superClass , getter );
403
384
}
404
- if ( foreignPackageClassInfo .setters .contains ( setter ) ) {
385
+ if ( bridgeMembersClassInfo .setters .contains ( setter ) && ! Modifier . isPublic ( setter . getModifiers () ) ) {
405
386
setters [j ] = new ForeignPackageMember ( superClass , setter );
406
387
}
407
388
}
@@ -623,16 +604,31 @@ private boolean is64BitType(Class<?> type) {
623
604
}
624
605
}
625
606
626
- private List <ForeignPackageClassInfo > createForeignPackageClassInfos (Class <?> clazz ) {
627
- final List <ForeignPackageClassInfo > foreignPackageClassInfos = new ArrayList <>();
607
+ private List <BridgeMembersClassInfo > createBridgeMembersClassInfos (
608
+ Class <?> clazz ,
609
+ Member [] getters ,
610
+ Member [] setters ,
611
+ String [] propertyNames ) {
612
+ final List <BridgeMembersClassInfo > bridgeMembersClassInfos = new ArrayList <>();
628
613
Class <?> c = clazz .getSuperclass ();
629
614
while (c != Object .class ) {
630
- if ( !c .getPackageName ().equals ( clazz .getPackageName () ) ) {
631
- foreignPackageClassInfos .add ( new ForeignPackageClassInfo ( c ) );
615
+ final BridgeMembersClassInfo bridgeMemberClassInfo = new BridgeMembersClassInfo ( c );
616
+ for ( int i = 0 ; i < getters .length ; i ++ ) {
617
+ final Member getter = getters [i ];
618
+ final Member setter = setters [i ];
619
+ if ( getter .getDeclaringClass () == c && !Modifier .isPublic ( getter .getModifiers () )
620
+ || setter .getDeclaringClass () == c && !Modifier .isPublic ( setter .getModifiers () ) ) {
621
+ bridgeMemberClassInfo .getters .add ( getter );
622
+ bridgeMemberClassInfo .setters .add ( setter );
623
+ bridgeMemberClassInfo .propertyNames .add ( propertyNames [i ] );
624
+ }
625
+ }
626
+ if ( !bridgeMemberClassInfo .propertyNames .isEmpty () ) {
627
+ bridgeMembersClassInfos .add ( bridgeMemberClassInfo );
632
628
}
633
629
c = c .getSuperclass ();
634
630
}
635
- return foreignPackageClassInfos ;
631
+ return bridgeMembersClassInfos ;
636
632
}
637
633
638
634
public ByteBuddyProxyHelper getByteBuddyProxyHelper () {
0 commit comments