From 26c6a742d9e9062f702c2601d5bc897a239e6005 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 10 Oct 2022 16:49:55 +0200 Subject: [PATCH] Introduce setLoadedClassHandler method on CGLIB ReflectUtils See gh-29295 --- .../cglib/core/AbstractClassGenerator.java | 4 +++- .../cglib/core/ReflectUtils.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java b/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java index 873e3ed76f..0620270397 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java @@ -349,7 +349,9 @@ abstract public class AbstractClassGenerator implements ClassGenerator { if (attemptLoad) { try { // SPRING PATCH BEGIN - gen = Class.forName(getClassName(), true, classLoader); + synchronized (classLoader) { // just in case + gen = ReflectUtils.loadClass(getClassName(), classLoader); + } // SPRING PATCH END return gen; } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java b/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java index 9c5c284fe3..4f3f2bac8d 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/ReflectUtils.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; +import java.util.function.Consumer; import org.springframework.asm.Type; @@ -63,6 +64,8 @@ public class ReflectUtils { private static BiConsumer generatedClassHandler; + private static Consumer> loadedClassHandler; + // SPRING PATCH BEGIN static { // Resolve protected ClassLoader.defineClass method for fallback use @@ -550,6 +553,21 @@ public class ReflectUtils { Class.forName(className, true, loader); return c; } + + public static void setLoadedClassHandler(Consumer> loadedClassHandler) { + ReflectUtils.loadedClassHandler = loadedClassHandler; + } + + public static Class loadClass(String className, ClassLoader classLoader) throws ClassNotFoundException { + // Force static initializers to run. + Class clazz = Class.forName(className, true, classLoader); + Consumer> handlerToUse = loadedClassHandler; + if (handlerToUse != null) { + handlerToUse.accept(clazz); + } + return clazz; + } + // SPRING PATCH END public static int findPackageProtected(Class[] classes) {