diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java index ca6133a7bb..e29ba82fbd 100644 --- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java +++ b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java @@ -1193,7 +1193,7 @@ public Serializer getRawSerializer(Class cls) { @Override public Class getSerializerClass(Class cls) { boolean codegen = - supportCodegenForJavaSerialization(cls) && fory.getConfig().isCodeGenEnabled(); + fory.getConfig().isCodeGenEnabled() && supportCodegenForJavaSerialization(cls); return getSerializerClass(cls, codegen); } @@ -1341,7 +1341,7 @@ public Object id() { public Class getObjectSerializerClass( Class cls, JITContext.SerializerJITCallback> callback) { boolean codegen = - supportCodegenForJavaSerialization(cls) && fory.getConfig().isCodeGenEnabled(); + fory.getConfig().isCodeGenEnabled() && supportCodegenForJavaSerialization(cls); return getObjectSerializerClass(cls, false, codegen, callback); } diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java index 841bec0466..e10116c4c1 100644 --- a/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java +++ b/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java @@ -32,14 +32,19 @@ public final class CodegenSerializer { public static boolean supportCodegenForJavaSerialization(Class cls) { - // bean class can be static nested class, but can't be a non-static inner class - // If a class is a static class, the enclosing class must not be null. - // If enclosing class is null, it must not be a static class. + // bean class can be static nested class, but can't be a non-static inner class. + // Check modifiers first to avoid loading the enclosing class unnecessarily — + // in classloader-isolated environments (e.g. OSGi, module systems) the enclosing + // class may not be visible, causing NoClassDefFoundError. + if (Modifier.isStatic(cls.getModifiers())) { + return true; + } try { - return cls.getEnclosingClass() == null || Modifier.isStatic(cls.getModifiers()); - + return cls.getEnclosingClass() == null; } catch (Throwable t) { - throw new RuntimeException(t); + // Enclosing class is not loadable — the class cannot be a valid non-static + // inner class in this context, so codegen is not applicable. + return false; } }