From: Decebal Suiu Date: Tue, 10 Jul 2018 22:31:36 +0000 (+0300) Subject: Add loaded classes information in PluginClassLoader X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fheads%2Fplugin_loaded_classes;p=pf4j.git Add loaded classes information in PluginClassLoader --- diff --git a/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java b/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java index 17116ae..0e750ad 100644 --- a/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java +++ b/pf4j/src/main/java/org/pf4j/AbstractPluginManager.java @@ -619,6 +619,13 @@ public abstract class AbstractPluginManager implements PluginManager { if (plugin.getPluginClassLoader() == classLoader) { return plugin; } + + if (plugin.getPluginClassLoader() instanceof PluginClassLoader) { + PluginClassLoader pluginClassLoader = (PluginClassLoader) plugin.getPluginClassLoader(); + if (pluginClassLoader.isClassLoaded(clazz.getName())) { + return plugin; + } + } } return null; diff --git a/pf4j/src/main/java/org/pf4j/PluginClassLoader.java b/pf4j/src/main/java/org/pf4j/PluginClassLoader.java index 2043929..1fc79da 100644 --- a/pf4j/src/main/java/org/pf4j/PluginClassLoader.java +++ b/pf4j/src/main/java/org/pf4j/PluginClassLoader.java @@ -22,7 +22,10 @@ import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * One instance of this class should be created by plugin manager for every available plug-in. @@ -43,6 +46,8 @@ public class PluginClassLoader extends URLClassLoader { private PluginDescriptor pluginDescriptor; private boolean parentFirst; + private Set loadedClasses; + public PluginClassLoader(PluginManager pluginManager, PluginDescriptor pluginDescriptor, ClassLoader parent) { this(pluginManager, pluginDescriptor, parent, false); } @@ -57,6 +62,8 @@ public class PluginClassLoader extends URLClassLoader { this.pluginManager = pluginManager; this.pluginDescriptor = pluginDescriptor; this.parentFirst = parentFirst; + + loadedClasses = new HashSet<>(); } @Override @@ -108,6 +115,7 @@ public class PluginClassLoader extends URLClassLoader { try { loadedClass = findClass(className); log.trace("Found class '{}' in plugin classpath", className); + loadedClasses.add(className); return loadedClass; } catch (ClassNotFoundException e) { // try next step @@ -138,6 +146,7 @@ public class PluginClassLoader extends URLClassLoader { try { loadedClass = findClass(className); log.trace("Found class '{}' in plugin classpath", className); + loadedClasses.add(className); return loadedClass; } catch (ClassNotFoundException e) { // try next step @@ -189,6 +198,18 @@ public class PluginClassLoader extends URLClassLoader { } } + /** + * Returns all classes loaded by this class loader. + */ + public Set getLoadedClasses() { + return Collections.unmodifiableSet(loadedClasses); + } + + public boolean isClassLoaded(String className) { +// return findLoadedClass(className) != null; + return loadedClasses.contains(className); + } + private Class loadClassFromDependencies(String className) { log.trace("Search in dependencies for class '{}'", className); List dependencies = pluginDescriptor.getDependencies();