From b43086275dbf120f9d181176b0c16b668112167a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 21 Nov 2022 13:03:46 +0100 Subject: [PATCH] Make GeneratorStrategy.generate unreachable on native This change provides also more information to the user about the missing generated class when that happens. Closes gh-29521 --- .../aot/nativex/feature/PreComputeFieldFeature.java | 1 + .../cglib/core/AbstractClassGenerator.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/feature/PreComputeFieldFeature.java b/spring-core/src/main/java/org/springframework/aot/nativex/feature/PreComputeFieldFeature.java index 9efa0343343b..075407825bd9 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/feature/PreComputeFieldFeature.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/feature/PreComputeFieldFeature.java @@ -34,6 +34,7 @@ class PreComputeFieldFeature implements Feature { private static Pattern[] patterns = { Pattern.compile(Pattern.quote("org.springframework.core.NativeDetector#imageCode")), + Pattern.compile(Pattern.quote("org.springframework.cglib.core.AbstractClassGenerator#imageCode")), Pattern.compile(Pattern.quote("org.springframework.") + ".*#.*Present"), Pattern.compile(Pattern.quote("org.springframework.") + ".*#.*PRESENT"), Pattern.compile(Pattern.quote("reactor.") + ".*#.*Available") 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 062027039730..e2d23d1d070d 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 @@ -43,6 +43,9 @@ abstract public class AbstractClassGenerator implements ClassGenerator { private static final boolean DEFAULT_USE_CACHE = Boolean.parseBoolean(System.getProperty("cglib.useCache", "true")); + // See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java + private static final boolean imageCode = (System.getProperty("org.graalvm.nativeimage.imagecode") != null); + private GeneratorStrategy strategy = DefaultGeneratorStrategy.INSTANCE; @@ -359,6 +362,12 @@ protected Class generate(ClassLoaderData data) { // ignore } } + // SPRING PATCH BEGIN + if (imageCode) { + throw new UnsupportedOperationException("CGLIB runtime enhancement not supported on native image. " + + "Make sure to include a pre-generated class on the classpath instead: " + getClassName()); + } + // SPRING PATCH END byte[] b = strategy.generate(this); String className = ClassNameReader.getClassName(new ClassReader(b)); ProtectionDomain protectionDomain = getProtectionDomain();