]> source.dussan.org Git - pf4j.git/commitdiff
Add loaded classes information in PluginClassLoader plugin_loaded_classes
authorDecebal Suiu <decebal.suiu@gmail.com>
Tue, 10 Jul 2018 22:31:36 +0000 (01:31 +0300)
committerDecebal Suiu <decebal.suiu@gmail.com>
Tue, 10 Jul 2018 22:31:36 +0000 (01:31 +0300)
pf4j/src/main/java/org/pf4j/AbstractPluginManager.java
pf4j/src/main/java/org/pf4j/PluginClassLoader.java

index 17116ae7e7fd2ebb113fad3baa30463aebaacfbe..0e750ade8efa51680c65c4d972409b2849b2a4bd 100644 (file)
@@ -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;
index 2043929395920c7555e0648045fd0ecc1ed9d547..1fc79da2d5a31cb6b27d854fe64de4f146acdc26 100644 (file)
@@ -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<String> 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<String> 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<PluginDependency> dependencies = pluginDescriptor.getDependencies();