ASM ClassWriter uses application ClassLoader for its getCommonSuperClass check

Issue: SPR-13695
This commit is contained in:
Juergen Hoeller
2015-11-24 17:38:02 +01:00
parent 3aefc96593
commit 20a286b4d6
7 changed files with 187 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -134,7 +134,7 @@ public class SpelCompiler implements Opcodes {
private Class<? extends CompiledExpression> createExpressionClass(SpelNodeImpl expressionToCompile) {
// Create class outline 'spel/ExNNN extends org.springframework.expression.spel.CompiledExpression'
String clazzName = "spel/Ex" + getNextSuffix();
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS|ClassWriter.COMPUTE_FRAMES);
ClassWriter cw = new ExpressionClassWriter();
cw.visit(V1_5, ACC_PUBLIC, clazzName, null, "org/springframework/expression/spel/CompiledExpression", null);
// Create default constructor
@@ -256,20 +256,20 @@ public class SpelCompiler implements Opcodes {
}
catch (IOException ex) {
throw new IllegalStateException(
"Unexpected problem dumping class " + nameToUse + " into " + dumpLocation, ex);
"Unexpected problem dumping class '" + nameToUse + "' into " + dumpLocation, ex);
}
}
/**
* A ChildClassLoader will load the generated compiled expression classes
* A ChildClassLoader will load the generated compiled expression classes.
*/
public static class ChildClassLoader extends URLClassLoader {
private static class ChildClassLoader extends URLClassLoader {
private static final URL[] NO_URLS = new URL[0];
public ChildClassLoader(ClassLoader classloader) {
super(NO_URLS, classloader);
public ChildClassLoader(ClassLoader classLoader) {
super(NO_URLS, classLoader);
}
public Class<?> defineClass(String name, byte[] bytes) {
@@ -277,4 +277,17 @@ public class SpelCompiler implements Opcodes {
}
}
private class ExpressionClassWriter extends ClassWriter {
public ExpressionClassWriter() {
super(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
}
@Override
protected ClassLoader getClassLoader() {
return ccl;
}
}
}