Skip to content

Commit ac047cd

Browse files
committed
HHH-19733 Extract many more ByteBuddy related constants for more efficient class enhancement
1 parent 06eacf5 commit ac047cd

17 files changed

+1254
-992
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.bytecode.enhance.internal.bytebuddy;
6+
7+
import java.lang.reflect.Member;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import java.util.Objects;
11+
12+
public class BridgeMembersClassInfo {
13+
private final Class<?> clazz;
14+
private final List<String> propertyNames = new ArrayList<>();
15+
private final List<Member> getters = new ArrayList<>();
16+
private final List<Member> setters = new ArrayList<>();
17+
18+
public BridgeMembersClassInfo(Class<?> clazz) {
19+
this.clazz = Objects.requireNonNull(clazz);
20+
}
21+
22+
public Class<?> getClazz() {
23+
return clazz;
24+
}
25+
26+
public Iterable<Member> gettersIterable() {
27+
return getters;
28+
}
29+
30+
public Iterable<Member> settersIterable() {
31+
return setters;
32+
}
33+
34+
public boolean containsGetter(Member getter) {
35+
return getters.contains( getter );
36+
}
37+
38+
public boolean containsSetter(Member setter) {
39+
return setters.contains( setter );
40+
}
41+
42+
public void addGetter(Member getter) {
43+
getters.add( getter );
44+
}
45+
46+
public void addSetter(Member setter) {
47+
setters.add( setter );
48+
}
49+
50+
public void addProperty(String propertyName) {
51+
propertyNames.add( propertyName );
52+
}
53+
54+
public boolean propertyNamesIsEmpty() {
55+
return propertyNames.isEmpty();
56+
}
57+
58+
public String encodeName() {
59+
return NameEncodeHelper.encodeName(
60+
propertyNames.toArray( new String[0] ),
61+
getters.toArray( new Member[0] ),
62+
setters.toArray( new Member[0] )
63+
);
64+
}
65+
}

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/ByteBuddyEnhancementContext.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ class ByteBuddyEnhancementContext {
3131
private static final ElementMatcher.Junction<MethodDescription> IS_GETTER = isGetter();
3232

3333
private final EnhancementContext enhancementContext;
34+
private final EnhancerImplConstants constants;
3435

3536
private final ConcurrentHashMap<TypeDescription, Map<String, MethodDescription>> getterByTypeMap = new ConcurrentHashMap<>();
3637
private final ConcurrentHashMap<String, Object> locksMap = new ConcurrentHashMap<>();
3738

38-
ByteBuddyEnhancementContext(final EnhancementContext enhancementContext) {
39+
ByteBuddyEnhancementContext(final EnhancementContext enhancementContext, EnhancerImplConstants enhancerConstants) {
3940
this.enhancementContext = Objects.requireNonNull( enhancementContext );
41+
this.constants = enhancerConstants;
4042
}
4143

4244
public boolean isEntityClass(TypeDescription classDescriptor) {
@@ -122,7 +124,8 @@ else if ( isMappedSuperclassClass( managedCtClass ) ) {
122124
final EnhancerImpl.AnnotatedFieldDescription[] enhancedFields = PersistentAttributeTransformer.collectPersistentFields(
123125
managedCtClass,
124126
this,
125-
typePool
127+
typePool,
128+
constants
126129
)
127130
.getEnhancedFields();
128131
for ( EnhancerImpl.AnnotatedFieldDescription enhancedField : enhancedFields ) {

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,17 @@
3434
import org.hibernate.AssertionFailure;
3535
import org.hibernate.Version;
3636
import org.hibernate.bytecode.enhance.VersionMismatchException;
37-
import org.hibernate.bytecode.enhance.internal.tracker.CompositeOwnerTracker;
38-
import org.hibernate.bytecode.enhance.internal.tracker.DirtyTracker;
3937
import org.hibernate.bytecode.enhance.spi.EnhancementContext;
4038
import org.hibernate.bytecode.enhance.spi.EnhancementException;
4139
import org.hibernate.bytecode.enhance.spi.EnhancementInfo;
4240
import org.hibernate.bytecode.enhance.spi.Enhancer;
4341
import org.hibernate.bytecode.enhance.spi.EnhancerConstants;
4442
import org.hibernate.bytecode.enhance.spi.UnloadedField;
4543
import org.hibernate.bytecode.enhance.spi.UnsupportedEnhancementStrategy;
46-
import org.hibernate.bytecode.enhance.spi.interceptor.LazyAttributeLoadingInterceptor;
4744
import org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState;
4845
import org.hibernate.engine.spi.CompositeOwner;
49-
import org.hibernate.engine.spi.CompositeTracker;
5046
import org.hibernate.engine.spi.ExtendedSelfDirtinessTracker;
5147
import org.hibernate.engine.spi.Managed;
52-
import org.hibernate.engine.spi.ManagedComposite;
53-
import org.hibernate.engine.spi.ManagedEntity;
54-
import org.hibernate.engine.spi.ManagedMappedSuperclass;
55-
import org.hibernate.engine.spi.PersistentAttributeInterceptable;
56-
import org.hibernate.engine.spi.SelfDirtinessTracker;
5748
import org.hibernate.internal.CoreLogging;
5849
import org.hibernate.internal.CoreMessageLogger;
5950

@@ -105,7 +96,7 @@ public EnhancerImpl(final EnhancementContext enhancementContext, final ByteBuddy
10596
* @param classLocator
10697
*/
10798
public EnhancerImpl(final EnhancementContext enhancementContext, final ByteBuddyState byteBuddyState, final EnhancerClassLocator classLocator) {
108-
this.enhancementContext = new ByteBuddyEnhancementContext( enhancementContext );
99+
this.enhancementContext = new ByteBuddyEnhancementContext( enhancementContext, byteBuddyState.getEnhancerConstants() );
109100
this.byteBuddyState = Objects.requireNonNull( byteBuddyState );
110101
this.typePool = Objects.requireNonNull( classLocator );
111102
this.constants = byteBuddyState.getEnhancerConstants();
@@ -205,8 +196,9 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
205196

206197
log.tracef( "Enhancing [%s] as Entity", managedCtClass.getName() );
207198
DynamicType.Builder<?> builder = builderSupplier.get();
208-
builder = builder.implement( ManagedEntity.class )
209-
.defineMethod( EnhancerConstants.ENTITY_INSTANCE_GETTER_NAME, constants.TypeObject, constants.methodModifierPUBLIC )
199+
builder = builder
200+
.implement( constants.INTERFACES_for_ManagedEntity )
201+
.defineMethod( EnhancerConstants.ENTITY_INSTANCE_GETTER_NAME, constants.TypeObject, constants.modifierPUBLIC )
210202
.intercept( FixedValue.self() );
211203

212204
builder = addFieldWithGetterAndSetter(
@@ -260,44 +252,44 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
260252
List<AnnotatedFieldDescription> collectionFields = collectCollectionFields( managedCtClass );
261253

262254
if ( collectionFields.isEmpty() ) {
263-
builder = builder.implement( SelfDirtinessTracker.class )
264-
.defineField( EnhancerConstants.TRACKER_FIELD_NAME, DirtyTracker.class, constants.fieldModifierPRIVATE_TRANSIENT )
255+
builder = builder.implement( constants.INTERFACES_for_SelfDirtinessTracker )
256+
.defineField( EnhancerConstants.TRACKER_FIELD_NAME, constants.DirtyTrackerTypeDescription, constants.modifierPRIVATE_TRANSIENT )
265257
.annotateField( constants.TRANSIENT_ANNOTATION )
266-
.defineMethod( EnhancerConstants.TRACKER_CHANGER_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
267-
.withParameters( String.class )
258+
.defineMethod( EnhancerConstants.TRACKER_CHANGER_NAME, constants.TypeVoid, constants.modifierPUBLIC )
259+
.withParameter( constants.TypeString )
268260
.intercept( constants.implementationTrackChange )
269-
.defineMethod( EnhancerConstants.TRACKER_GET_NAME, constants.Type_Array_String, constants.methodModifierPUBLIC )
261+
.defineMethod( EnhancerConstants.TRACKER_GET_NAME, constants.Type_Array_String, constants.modifierPUBLIC )
270262
.intercept( constants.implementationGetDirtyAttributesWithoutCollections )
271-
.defineMethod( EnhancerConstants.TRACKER_HAS_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.methodModifierPUBLIC )
263+
.defineMethod( EnhancerConstants.TRACKER_HAS_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.modifierPUBLIC )
272264
.intercept( constants.implementationAreFieldsDirtyWithoutCollections )
273-
.defineMethod( EnhancerConstants.TRACKER_CLEAR_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
265+
.defineMethod( EnhancerConstants.TRACKER_CLEAR_NAME, constants.TypeVoid, constants.modifierPUBLIC )
274266
.intercept( constants.implementationClearDirtyAttributesWithoutCollections )
275-
.defineMethod( EnhancerConstants.TRACKER_SUSPEND_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
276-
.withParameters( constants.TypeBooleanPrimitive )
267+
.defineMethod( EnhancerConstants.TRACKER_SUSPEND_NAME, constants.TypeVoid, constants.modifierPUBLIC )
268+
.withParameter( constants.TypeBooleanPrimitive )
277269
.intercept( constants.implementationSuspendDirtyTracking )
278-
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_GET_NAME, constants.TypeCollectionTracker, constants.methodModifierPUBLIC )
270+
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_GET_NAME, constants.TypeCollectionTracker, constants.modifierPUBLIC )
279271
.intercept( constants.implementationGetCollectionTrackerWithoutCollections );
280272
}
281273
else {
282274
//TODO es.enableInterfaceExtendedSelfDirtinessTracker ? Careful with consequences..
283-
builder = builder.implement( ExtendedSelfDirtinessTracker.class )
284-
.defineField( EnhancerConstants.TRACKER_FIELD_NAME, DirtyTracker.class, constants.fieldModifierPRIVATE_TRANSIENT )
275+
builder = builder.implement( constants.INTERFACES_for_ExtendedSelfDirtinessTracker )
276+
.defineField( EnhancerConstants.TRACKER_FIELD_NAME, constants.DirtyTrackerTypeDescription, constants.modifierPRIVATE_TRANSIENT )
285277
.annotateField( constants.TRANSIENT_ANNOTATION )
286-
.defineField( EnhancerConstants.TRACKER_COLLECTION_NAME, constants.TypeCollectionTracker, constants.fieldModifierPRIVATE_TRANSIENT )
278+
.defineField( EnhancerConstants.TRACKER_COLLECTION_NAME, constants.TypeCollectionTracker, constants.modifierPRIVATE_TRANSIENT )
287279
.annotateField( constants.TRANSIENT_ANNOTATION )
288-
.defineMethod( EnhancerConstants.TRACKER_CHANGER_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
289-
.withParameters( String.class )
280+
.defineMethod( EnhancerConstants.TRACKER_CHANGER_NAME, constants.TypeVoid, constants.modifierPUBLIC )
281+
.withParameter( constants.TypeString )
290282
.intercept( constants.implementationTrackChange )
291-
.defineMethod( EnhancerConstants.TRACKER_GET_NAME, constants.Type_Array_String, constants.methodModifierPUBLIC )
283+
.defineMethod( EnhancerConstants.TRACKER_GET_NAME, constants.Type_Array_String, constants.modifierPUBLIC )
292284
.intercept( constants.implementationGetDirtyAttributes )
293-
.defineMethod( EnhancerConstants.TRACKER_HAS_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.methodModifierPUBLIC )
285+
.defineMethod( EnhancerConstants.TRACKER_HAS_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.modifierPUBLIC )
294286
.intercept( constants.implementationAreFieldsDirty )
295-
.defineMethod( EnhancerConstants.TRACKER_CLEAR_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
287+
.defineMethod( EnhancerConstants.TRACKER_CLEAR_NAME, constants.TypeVoid, constants.modifierPUBLIC )
296288
.intercept( constants.implementationClearDirtyAttributes )
297-
.defineMethod( EnhancerConstants.TRACKER_SUSPEND_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
298-
.withParameters( constants.TypeBooleanPrimitive )
289+
.defineMethod( EnhancerConstants.TRACKER_SUSPEND_NAME, constants.TypeVoid, constants.modifierPUBLIC )
290+
.withParameter( constants.TypeBooleanPrimitive )
299291
.intercept( constants.implementationSuspendDirtyTracking )
300-
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_GET_NAME, constants.TypeCollectionTracker, constants.methodModifierPUBLIC )
292+
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_GET_NAME, constants.TypeCollectionTracker, constants.modifierPUBLIC )
301293
.intercept( FieldAccessor.ofField( EnhancerConstants.TRACKER_COLLECTION_NAME ) );
302294

303295
Implementation isDirty = StubMethod.INSTANCE, getDirtyNames = StubMethod.INSTANCE, clearDirtyNames = StubMethod.INSTANCE;
@@ -359,17 +351,17 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
359351
clearDirtyNames = constants.adviceInitializeLazyAttributeLoadingInterceptor.wrap( clearDirtyNames );
360352
}
361353

362-
builder = builder.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.methodModifierPUBLIC )
354+
builder = builder.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CHANGED_NAME, constants.TypeBooleanPrimitive, constants.modifierPUBLIC )
363355
.intercept( isDirty )
364-
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
365-
.withParameters( DirtyTracker.class )
356+
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME, constants.TypeVoid, constants.modifierPUBLIC )
357+
.withParameter( constants.DirtyTrackerTypeDescription )
366358
.intercept( getDirtyNames )
367-
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CLEAR_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
359+
.defineMethod( EnhancerConstants.TRACKER_COLLECTION_CLEAR_NAME, constants.TypeVoid, constants.modifierPUBLIC )
368360
.intercept( Advice.withCustomMapping()
369361
.to( CodeTemplates.ClearDirtyCollectionNames.class, constants.adviceLocator )
370362
.wrap( StubMethod.INSTANCE ) )
371-
.defineMethod( ExtendedSelfDirtinessTracker.REMOVE_DIRTY_FIELDS_NAME, constants.TypeVoid, constants.methodModifierPUBLIC )
372-
.withParameters( LazyAttributeLoadingInterceptor.class )
363+
.defineMethod( ExtendedSelfDirtinessTracker.REMOVE_DIRTY_FIELDS_NAME, constants.TypeVoid, constants.modifierPUBLIC )
364+
.withParameter( constants.TypeLazyAttributeLoadingInterceptor )
373365
.intercept( clearDirtyNames );
374366
}
375367
}
@@ -385,30 +377,30 @@ else if ( enhancementContext.isCompositeClass( managedCtClass ) ) {
385377
log.tracef( "Enhancing [%s] as Composite", managedCtClass.getName() );
386378

387379
DynamicType.Builder<?> builder = builderSupplier.get();
388-
builder = builder.implement( ManagedComposite.class );
380+
builder = builder.implement( constants.INTERFACES_for_ManagedComposite );
389381
builder = addInterceptorHandling( builder, managedCtClass );
390382

391383
if ( enhancementContext.doDirtyCheckingInline() ) {
392-
builder = builder.implement( CompositeTracker.class )
384+
builder = builder.implement( constants.INTERFACES_for_CompositeTracker )
393385
.defineField(
394386
EnhancerConstants.TRACKER_COMPOSITE_FIELD_NAME,
395-
CompositeOwnerTracker.class,
396-
constants.fieldModifierPRIVATE_TRANSIENT
387+
constants.TypeCompositeOwnerTracker,
388+
constants.modifierPRIVATE_TRANSIENT
397389
)
398390
.annotateField( constants.TRANSIENT_ANNOTATION )
399391
.defineMethod(
400392
EnhancerConstants.TRACKER_COMPOSITE_SET_OWNER,
401393
constants.TypeVoid,
402-
constants.methodModifierPUBLIC
394+
constants.modifierPUBLIC
403395
)
404396
.withParameters( String.class, CompositeOwner.class )
405397
.intercept( constants.implementationSetOwner )
406398
.defineMethod(
407399
EnhancerConstants.TRACKER_COMPOSITE_CLEAR_OWNER,
408400
constants.TypeVoid,
409-
constants.methodModifierPUBLIC
401+
constants.modifierPUBLIC
410402
)
411-
.withParameters( String.class )
403+
.withParameter( constants.TypeString )
412404
.intercept( constants.implementationClearOwner );
413405
}
414406

@@ -423,7 +415,7 @@ else if ( enhancementContext.isMappedSuperclassClass( managedCtClass ) ) {
423415
log.tracef( "Enhancing [%s] as MappedSuperclass", managedCtClass.getName() );
424416

425417
DynamicType.Builder<?> builder = builderSupplier.get();
426-
builder = builder.implement( ManagedMappedSuperclass.class );
418+
builder = builder.implement( constants.INTERFACES_for_ManagedMappedSuperclass );
427419
return createTransformer( managedCtClass ).applyTo( builder );
428420
}
429421
else if ( enhancementContext.doExtendedEnhancement() ) {
@@ -658,7 +650,7 @@ private static boolean checkUnsupportedAttributeNaming(TypeDescription managedCt
658650
}
659651

660652
private PersistentAttributeTransformer createTransformer(TypeDescription typeDescription) {
661-
return PersistentAttributeTransformer.collectPersistentFields( typeDescription, enhancementContext, typePool );
653+
return PersistentAttributeTransformer.collectPersistentFields( typeDescription, enhancementContext, typePool, constants );
662654
}
663655

664656
// See HHH-10977 HHH-11284 HHH-11404 --- check for declaration of Managed interface on the class, not inherited
@@ -676,7 +668,7 @@ private DynamicType.Builder<?> addInterceptorHandling(DynamicType.Builder<?> bui
676668
if ( enhancementContext.hasLazyLoadableAttributes( managedCtClass ) ) {
677669
log.tracef( "Weaving in PersistentAttributeInterceptable implementation on [%s]", managedCtClass.getName() );
678670

679-
builder = builder.implement( PersistentAttributeInterceptable.class );
671+
builder = builder.implement( constants.INTERFACES_for_PersistentAttributeInterceptable );
680672

681673
builder = addFieldWithGetterAndSetter(
682674
builder,
@@ -697,12 +689,12 @@ private DynamicType.Builder<?> addFieldWithGetterAndSetter(
697689
String getterName,
698690
String setterName) {
699691
return builder
700-
.defineField( fieldName, type, constants.fieldModifierPRIVATE_TRANSIENT )
692+
.defineField( fieldName, type, constants.modifierPRIVATE_TRANSIENT )
701693
.annotateField( constants.TRANSIENT_ANNOTATION )
702-
.defineMethod( getterName, type, constants.methodModifierPUBLIC )
694+
.defineMethod( getterName, type, constants.modifierPUBLIC )
703695
.intercept( FieldAccessor.ofField( fieldName ) )
704-
.defineMethod( setterName, constants.TypeVoid, constants.methodModifierPUBLIC )
705-
.withParameters( type )
696+
.defineMethod( setterName, constants.TypeVoid, constants.modifierPUBLIC )
697+
.withParameter( type )
706698
.intercept( FieldAccessor.ofField( fieldName ) );
707699
}
708700

@@ -713,7 +705,7 @@ private DynamicType.Builder<?> addSetPersistenceInfoMethod(
713705
TypeDefinition intType) {
714706
return builder
715707
// returns previous entity entry
716-
.defineMethod( EnhancerConstants.PERSISTENCE_INFO_SETTER_NAME, entityEntryType, constants.methodModifierPUBLIC )
708+
.defineMethod( EnhancerConstants.PERSISTENCE_INFO_SETTER_NAME, entityEntryType, constants.modifierPUBLIC )
717709
// previous, next, instance-id
718710
.withParameters( entityEntryType, managedEntityType, managedEntityType, intType )
719711
.intercept( constants.implementationSetPersistenceInfo );

0 commit comments

Comments
 (0)