Skip to content

Commit

Permalink
Fix ClassCircularityError in the ASURLClassLoader
Browse files Browse the repository at this point in the history
Signed-off-by: Alexander Pinčuk <alexander.v.pinchuk@gmail.com>
  • Loading branch information
avpinchuk committed Jun 4, 2023
1 parent e6610fe commit 1127fe0
Showing 1 changed file with 24 additions and 10 deletions.
Expand Up @@ -72,6 +72,7 @@
import org.glassfish.common.util.GlassfishUrlClassLoader;
import org.glassfish.hk2.api.PreDestroy;

import static java.lang.ThreadLocal.withInitial;
import static java.util.logging.Level.INFO;

/**
Expand Down Expand Up @@ -118,6 +119,9 @@ public class ASURLClassLoader extends GlassfishUrlClassLoader

private final ArrayList<ClassFileTransformer> transformers = new ArrayList<>(1);

/** Bytecode transformation flag */
private static final ThreadLocal<Boolean> BYTECODE_TRANSFORMATION = withInitial(() -> false);

private final static StringManager sm = StringManager.getManager(ASURLClassLoader.class);

//holder for declared and ee permissions
Expand Down Expand Up @@ -710,16 +714,26 @@ protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
@SuppressWarnings("unchecked")
final List<ClassFileTransformer> xformers = (ArrayList<ClassFileTransformer>) transformers.clone();
for (final ClassFileTransformer transformer : xformers) {
// see javadocs of transform().
// It expects class name as java/lang/Object
// as opposed to java.lang.Object
final String internalClassName = name.replace('.','/');
final byte[] transformedBytes = transformer.transform(this, internalClassName, null,
classData.pd, classData.getClassBytes());
if (transformedBytes != null) { // null indicates no transformation
_logger.log(INFO, CULoggerInfo.actuallyTransformed, name);
classData.setClassBytes(transformedBytes);
if (!xformers.isEmpty()) {
// Do not transform classes loaded by a transformers itself
if (!BYTECODE_TRANSFORMATION.get()) {
BYTECODE_TRANSFORMATION.set(true);
try {
for (final ClassFileTransformer transformer : xformers) {
// see javadocs of transform().
// It expects class name as java/lang/Object
// as opposed to java.lang.Object
final String internalClassName = name.replace('.', '/');
final byte[] transformedBytes = transformer.transform(this, internalClassName, null,
classData.pd, classData.getClassBytes());
if (transformedBytes != null) { // null indicates no transformation
_logger.log(INFO, CULoggerInfo.actuallyTransformed, name);
classData.setClassBytes(transformedBytes);
}
}
} finally {
BYTECODE_TRANSFORMATION.set(false);
}
}
}
} catch (IllegalClassFormatException icfEx) {
Expand Down

0 comments on commit 1127fe0

Please sign in to comment.