Skip to content

Commit 0c2f0de

Browse files
committed
HHH-19372 HHH-19369 Add Code Source Location HashCode to proxy generated classes
1 parent 3001ee5 commit 0c2f0de

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import net.bytebuddy.description.modifier.Visibility;
1717
import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy;
18+
import org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper;
1819

1920
public class BasicProxyFactoryImpl implements BasicProxyFactory {
2021

@@ -36,7 +37,7 @@ public BasicProxyFactoryImpl(final Class superClass, final Class interfaceClass,
3637

3738
final Class<?> superClassOrMainInterface = superClass != null ? superClass : interfaceClass;
3839
final ByteBuddyState.ProxyDefinitionHelpers helpers = byteBuddyState.getProxyDefinitionHelpers();
39-
final String proxyClassName = superClassOrMainInterface.getName() + "$" + PROXY_NAMING_SUFFIX;
40+
final String proxyClassName = ByteBuddyProxyHelper.getClassNameWithSuffix( superClassOrMainInterface, PROXY_NAMING_SUFFIX );
4041

4142
this.proxyClass = byteBuddyState.loadBasicProxy( superClassOrMainInterface, proxyClassName, (byteBuddy, namingStrategy) ->
4243
helpers.appendIgnoreAlsoAtEnd( byteBuddy

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public ReflectionOptimizer getReflectionOptimizer(
148148
fastClass = null;
149149
}
150150
else {
151-
final String className = clazz.getName() + "$" + INSTANTIATOR_PROXY_NAMING_SUFFIX;
151+
final String className = ByteBuddyProxyHelper.getClassNameWithSuffix( clazz, INSTANTIATOR_PROXY_NAMING_SUFFIX );
152152
fastClass = byteBuddyState.load( clazz, className, (byteBuddy, namingStrategy) -> byteBuddy
153153
.with( namingStrategy )
154154
.subclass( ReflectionOptimizer.InstantiationOptimizer.class )
@@ -210,7 +210,7 @@ public ReflectionOptimizer getReflectionOptimizer(
210210
fastClass = null;
211211
}
212212
else {
213-
final String className = clazz.getName() + "$" + INSTANTIATOR_PROXY_NAMING_SUFFIX;
213+
final String className = ByteBuddyProxyHelper.getClassNameWithSuffix( clazz, INSTANTIATOR_PROXY_NAMING_SUFFIX );
214214
fastClass = byteBuddyState.load( clazz, className, (byteBuddy, namingStrategy) -> byteBuddy
215215
.with( namingStrategy )
216216
.subclass( ReflectionOptimizer.InstantiationOptimizer.class )
@@ -236,7 +236,8 @@ public ReflectionOptimizer getReflectionOptimizer(
236236
final String[] propertyNames = propertyAccessMap.keySet().toArray( new String[0] );
237237
final Class<?> superClass = determineAccessOptimizerSuperClass( clazz, propertyNames, getters, setters );
238238

239-
final String className = clazz.getName() + "$" + OPTIMIZER_PROXY_NAMING_SUFFIX + encodeName( propertyNames, getters, setters );
239+
final String className = ByteBuddyProxyHelper.getClassNameWithSuffix( clazz, OPTIMIZER_PROXY_NAMING_SUFFIX )
240+
+ encodeName( propertyNames, getters, setters );
240241
final Class<?> bulkAccessor;
241242
if ( className.getBytes( StandardCharsets.UTF_8 ).length >= 0x10000 ) {
242243
// The JVM has a 64K byte limit on class name length, so fallback to random name if encoding exceeds that
@@ -322,7 +323,7 @@ private Class<?> determineAccessOptimizerSuperClass(Class<?> clazz, String[] pro
322323
final ForeignPackageClassInfo foreignPackageClassInfo = foreignPackageClassInfos.get( i );
323324
final Class<?> newSuperClass = superClass;
324325

325-
final String className = foreignPackageClassInfo.clazz.getName() + "$" + OPTIMIZER_PROXY_NAMING_SUFFIX + encodeName( foreignPackageClassInfo.propertyNames, foreignPackageClassInfo.getters, foreignPackageClassInfo.setters );
326+
final String className = ByteBuddyProxyHelper.getClassNameWithSuffix( foreignPackageClassInfo.clazz, OPTIMIZER_PROXY_NAMING_SUFFIX ) + encodeName( foreignPackageClassInfo.propertyNames, foreignPackageClassInfo.getters, foreignPackageClassInfo.setters );
326327
superClass = byteBuddyState.load(
327328
foreignPackageClassInfo.clazz,
328329
className,

hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyHelper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.Serializable;
88
import java.lang.reflect.Method;
9+
import java.net.URL;
910
import java.util.Collection;
1011
import java.util.Collections;
1112
import java.util.HashSet;
@@ -185,4 +186,17 @@ private static Method resolveIdSetterMethod(SerializableProxy serializableProxy)
185186
);
186187
}
187188
}
189+
190+
public static String getClassNameWithSuffix(Class<?> clazz, String suffix) {
191+
return getClassNameWithCodeSourceLocationHashCode(clazz) + "$" + suffix;
192+
}
193+
194+
private static String getClassNameWithCodeSourceLocationHashCode(Class<?> clazz) {
195+
final java.security.CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
196+
if ( codeSource == null ) {
197+
return clazz.getName();
198+
}
199+
final URL url = codeSource.getLocation();
200+
return url == null ? clazz.getName() : clazz.getName() + url.toString().hashCode();
201+
}
188202
}

0 commit comments

Comments
 (0)