Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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, EnhancerImplConstantsenhancerConstants) {
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)

AltStyle によって変換されたページ (->オリジナル) /