From 2986930aa26959a651e97bb9d86aa325e44b5b43 Mon Sep 17 00:00:00 2001 From: Dai MIKURUBE Date: Wed, 11 Sep 2024 16:49:49 +0900 Subject: [PATCH] Fix LoadedClassFinder --- .../junit5/engine/EmbulkPluginTestEngine.java | 5 ++- .../junit5/engine/LoadedClassFinder.java | 37 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/EmbulkPluginTestEngine.java b/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/EmbulkPluginTestEngine.java index eba4e2c..e914e36 100644 --- a/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/EmbulkPluginTestEngine.java +++ b/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/EmbulkPluginTestEngine.java @@ -138,10 +138,11 @@ public final Optional getArtifactId() { private static Class findOrLoadClassFrom(final ClassLoader klassLoader, final String name) { final Class foundClass = LoadedClassFinder.findFrom(klassLoader, name); if (foundClass != null) { - logger.info(() -> "\"" + name + "\" has been already loaded: " + foundClass.toString()); + logger.info(() -> "<" + name + "> has been already loaded in [" + klassLoader + "]: " + foundClass.toString()); + return foundClass; } - logger.info(() -> "\"" + name + "\" has not been loaded."); + logger.info(() -> "<" + name + "> has not been loaded in [" + klassLoader + "]."); try { return Class.forName(name); // <= TODO: Load it under PluginClassLoader ! } catch (final ClassNotFoundException ex) { diff --git a/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/LoadedClassFinder.java b/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/LoadedClassFinder.java index e14f7de..b01506f 100644 --- a/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/LoadedClassFinder.java +++ b/embulk-junit5-engine/src/main/java/org/embulk/junit5/engine/LoadedClassFinder.java @@ -16,14 +16,37 @@ package org.embulk.junit5.engine; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + class LoadedClassFinder extends ClassLoader { - private LoadedClassFinder(final ClassLoader inner) { - this.inner = inner; - } + static synchronized Class findFrom(final ClassLoader classLoader, final String name) { + final Method findLoadedClass; + try { + findLoadedClass = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class); + } catch (final NoSuchMethodException ex) { + throw new RuntimeException(ex); + } - static Class findFrom(final ClassLoader classLoader, final String name) { - return (new LoadedClassFinder(classLoader)).findLoadedClass(name); - } + findLoadedClass.setAccessible(true); + try { + final Object classObject; + try { + classObject = findLoadedClass.invoke(classLoader, name); + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException(ex); + } - private final ClassLoader inner; + if (classObject == null) { + return null; + } + if (classObject instanceof Class) { + return (Class) classObject; + } else { + throw new RuntimeException(); + } + } finally { + findLoadedClass.setAccessible(false); + } + } }