This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 714d9d57b631b47c3d6f896bd83ffe4bb42b0e5a Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Oct 28 13:04:41 2022 +0200 Java DSL - Fix classloading to use same loader in the same compilation unit. --- .../org/apache/camel/dsl/java/joor/ByteArrayClassLoader.java | 2 +- .../main/java/org/apache/camel/dsl/java/joor/MultiCompile.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ByteArrayClassLoader.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ByteArrayClassLoader.java index da1dd726116..ed6f8d8914c 100644 --- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ByteArrayClassLoader.java +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/ByteArrayClassLoader.java @@ -22,11 +22,11 @@ import java.util.Map; * {@link ClassLoader} that loads byte code from a byte array. */ final class ByteArrayClassLoader extends ClassLoader { + private final Map<String, byte[]> classes; public ByteArrayClassLoader(Map<String, byte[]> classes) { super(ByteArrayClassLoader.class.getClassLoader()); - this.classes = classes; } diff --git a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java index 66beffe4f74..c275e7f157f 100644 --- a/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java +++ b/dsl/camel-java-joor-dsl/src/main/java/org/apache/camel/dsl/java/joor/MultiCompile.java @@ -36,7 +36,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.StringJoiner; -import java.util.stream.Collectors; import javax.tools.Diagnostic; import javax.tools.DiagnosticCollector; @@ -69,8 +68,8 @@ public final class MultiCompile { /** * Compiles multiple files as one unit * - * @param unit the files to compile in the same unit - * @return the compilation result + * @param unit the files to compile in the same unit + * @return the compilation result */ public static CompilationUnit.Result compileUnit(CompilationUnit unit) { CompilationUnit.Result result = CompilationUnit.result(); @@ -137,7 +136,8 @@ public final class MultiCompile { } else { // grab detailed error so we can see compilation errors StringJoiner sj = new StringJoiner("\n"); - dc.getDiagnostics().stream().filter(d -> Diagnostic.Kind.ERROR.equals(d.getKind())).forEach(d -> sj.add(d.toString())); + dc.getDiagnostics().stream().filter(d -> Diagnostic.Kind.ERROR.equals(d.getKind())) + .forEach(d -> sj.add(d.toString())); throw new ReflectException("Compilation error:\n" + sj + "\n" + out); } } @@ -146,6 +146,7 @@ public final class MultiCompile { // We need a private-access lookup from the class in that stack frame in order to get // private-access to any local interfaces at that location. int index = 2; + ByteArrayClassLoader c = new ByteArrayClassLoader(fileManager.classes()); for (CharSequenceJavaFileObject f : files) { String className = f.getClassName(); @@ -177,7 +178,6 @@ public final class MultiCompile { } else { // Otherwise, use an arbitrary class loader. This approach doesn't allow for // loading private-access interfaces in the compiled class's type hierarchy - ByteArrayClassLoader c = new ByteArrayClassLoader(fileManager.classes()); final Map<String, byte[]> byteCodes = new HashMap<>(); Class<?> clazz = fileManager.loadAndReturnMainClass(className, (name, bytes) -> {