diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java index 28b9930b4..71311b305 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionClassLoader.java @@ -39,12 +39,13 @@ import java.util.Map; public class GeyserExtensionClassLoader extends URLClassLoader { private final GeyserExtensionLoader loader; private final Map> classes = new HashMap<>(); - private final Extension extension; - public GeyserExtensionClassLoader(GeyserExtensionLoader loader, ClassLoader parent, ExtensionDescription description, Path path) throws InvalidExtensionException, MalformedURLException { + public GeyserExtensionClassLoader(GeyserExtensionLoader loader, ClassLoader parent, Path path) throws MalformedURLException { super(new URL[] { path.toUri().toURL() }, parent); this.loader = loader; + } + public Extension load(ExtensionDescription description) throws InvalidExtensionException { try { Class jarClass; try { @@ -57,10 +58,10 @@ public class GeyserExtensionClassLoader extends URLClassLoader { try { extensionClass = jarClass.asSubclass(Extension.class); } catch (ClassCastException ex) { - throw new InvalidExtensionException("Main class " + description.main() + " should extends GeyserExtension, but extends " + jarClass.getSuperclass().getSimpleName(), ex); + throw new InvalidExtensionException("Main class " + description.main() + " should implement Extension, but extends " + jarClass.getSuperclass().getSimpleName(), ex); } - this.extension = extensionClass.getConstructor().newInstance(); + return extensionClass.getConstructor().newInstance(); } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) { throw new InvalidExtensionException("No public constructor", ex); } catch (InstantiationException ex) { @@ -77,6 +78,7 @@ public class GeyserExtensionClassLoader extends URLClassLoader { if (name.startsWith("org.geysermc.geyser.") || name.startsWith("net.minecraft.")) { throw new ClassNotFoundException(name); } + Class result = this.classes.get(name); if (result == null) { if (checkGlobal) { @@ -94,8 +96,4 @@ public class GeyserExtensionClassLoader extends URLClassLoader { } return result; } - - public Extension extension() { - return this.extension; - } } diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java index ff38ea52a..ac8da2679 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java @@ -78,13 +78,15 @@ public class GeyserExtensionLoader extends ExtensionLoader { final GeyserExtensionClassLoader loader; try { - loader = new GeyserExtensionClassLoader(this, getClass().getClassLoader(), description, path); + loader = new GeyserExtensionClassLoader(this, getClass().getClassLoader(), path); } catch (Throwable e) { throw new InvalidExtensionException(e); } this.classLoaders.put(description.name(), loader); - return this.setup(loader.extension(), description, dataFolder, new GeyserExtensionEventBus(GeyserImpl.getInstance().eventBus(), loader.extension())); + + final Extension extension = loader.load(description); + return this.setup(extension, description, dataFolder, new GeyserExtensionEventBus(GeyserImpl.getInstance().eventBus(), extension)); } private GeyserExtensionContainer setup(Extension extension, GeyserExtensionDescription description, Path dataFolder, ExtensionEventBus eventBus) { @@ -110,10 +112,11 @@ public class GeyserExtensionLoader extends ExtensionLoader { Class clazz = this.classes.get(name); try { for (GeyserExtensionClassLoader loader : this.classLoaders.values()) { - try { - clazz = loader.findClass(name,false); - } catch(NullPointerException ignored) { + if (clazz != null) { + continue; } + + clazz = loader.findClass(name, false); } return clazz; } catch (NullPointerException s) {