diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java index b7ecc18111..188a61434f 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java @@ -49,7 +49,12 @@ public abstract class JavaPlugin extends PluginBase { private File configFile = null; private PluginLogger logger = null; - public JavaPlugin() {} + public JavaPlugin() { + ClassLoader classLoader = this.getClass().getClassLoader(); + if (classLoader instanceof PluginClassLoader) { + ((PluginClassLoader) classLoader).initialize(this); + } + } /** * Returns the folder that the plugin data's files are located in. The diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 38ca9422c8..6ddcc1d595 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -134,7 +134,7 @@ public Plugin loadPlugin(File file) throws InvalidPluginException { loader = loaders.get(description.getClassLoaderOf()); loader.addURL(urls[0]); } else { - loader = new PluginClassLoader(this, urls, getClass().getClassLoader()); + loader = new PluginClassLoader(this, urls, getClass().getClassLoader(), server, description, dataFolder, file); } Class jarClass = Class.forName(description.getMain(), true, loader); @@ -143,8 +143,6 @@ public Plugin loadPlugin(File file) throws InvalidPluginException { Constructor constructor = plugin.getConstructor(); result = constructor.newInstance(); - - result.initialize(this, server, description, dataFolder, file, loader); } catch (InvocationTargetException ex) { throw new InvalidPluginException(ex.getCause()); } catch (Throwable ex) { diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java index dd7bffc5b6..6a9b4bbaab 100644 --- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java @@ -1,22 +1,43 @@ package org.bukkit.plugin.java; +import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.Validate; +import org.bukkit.Server; +import org.bukkit.plugin.PluginDescriptionFile; + /** * A ClassLoader for plugins, to allow shared classes across multiple plugins */ public class PluginClassLoader extends URLClassLoader { private final JavaPluginLoader loader; private final Map> classes = new HashMap>(); + private final PluginDescriptionFile description; + private final Server server; + private final File dataFolder; + private final File file; + /** + * Changed in favor of class loader that initializes plugins + */ + @Deprecated public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent) { + this(loader, urls, parent, null, null, null, null); + } + + public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent, final Server server, final PluginDescriptionFile description, final File dataFolder, final File file) { super(urls, parent); this.loader = loader; + this.server = server; + this.description = description; + this.dataFolder = dataFolder; + this.file = file; } @Override @@ -54,4 +75,13 @@ protected Class findClass(String name, boolean checkGlobal) throws ClassNotFo public Set getClasses() { return classes.keySet(); } + + void initialize(JavaPlugin javaPlugin) { + Validate.notNull(javaPlugin, "Initializing plugin cannot be null"); + Validate.isTrue(javaPlugin.getClass().getClassLoader() == this, "Cannot initialize plugin outside of this class loader"); + + if (server != null && description != null && dataFolder != null && file != null) { + javaPlugin.initialize(loader, server, description, dataFolder, file, this); + } + } }