Skip to content

Commit

Permalink
Fix LoadedClassFinder
Browse files Browse the repository at this point in the history
  • Loading branch information
dmikurube committed Sep 11, 2024
1 parent 8bae829 commit 2986930
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,11 @@ public final Optional<String> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

0 comments on commit 2986930

Please sign in to comment.