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
This commit is contained in:
Sébastien Deleuze 2022-11-21 13:03:46 +01:00
parent 2112e86795
commit 64c6a97130
2 changed files with 10 additions and 0 deletions

View File

@ -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"),

View File

@ -43,6 +43,9 @@ abstract public class AbstractClassGenerator<T> 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 @@ abstract public class AbstractClassGenerator<T> implements ClassGenerator {
// 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();