From 74f5f4c4f1334765629b1621c409dff5ae3bfa74 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Thu, 25 Jun 2020 18:42:33 +0200 Subject: [PATCH] v1.4.2 - Call PluginClassLoader through reflection --- build.gradle | 2 +- .../serverutils/managers/PluginManager.java | 20 +-------------- .../reflection/RPluginClassLoader.java | 25 +++++++++++++++---- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index 078966c..3fe80e8 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { String packagePath = 'net.frankheijden.serverutils' group = packagePath -version '1.4.1' +version '1.4.2' sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 repositories { diff --git a/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java b/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java index b62d7b9..08d6507 100644 --- a/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java +++ b/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java @@ -5,17 +5,13 @@ import net.frankheijden.serverutils.reflection.*; import org.bukkit.Bukkit; import org.bukkit.command.*; import org.bukkit.plugin.*; -import org.bukkit.plugin.java.PluginClassLoader; import java.io.File; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.frankheijden.serverutils.reflection.ReflectionUtils.set; - public class PluginManager { public static LoadResult loadPlugin(String jarFile) { @@ -78,7 +74,7 @@ public class PluginManager { try { RSimplePluginManager.getPlugins(Bukkit.getPluginManager()).remove(plugin); RSimplePluginManager.removeLookupName(Bukkit.getPluginManager(), plugin.getName()); - clearClassLoader(RJavaPlugin.getClassLoader(plugin)); + RPluginClassLoader.clearClassLoader(RJavaPlugin.getClassLoader(plugin)); } catch (Exception ex) { ex.printStackTrace(); return Result.ERROR; @@ -86,20 +82,6 @@ public class PluginManager { return Result.SUCCESS; } - public static void clearClassLoader(ClassLoader loader) throws IllegalAccessException, IOException { - if (loader == null) return; - if (loader instanceof PluginClassLoader) { - clearClassLoader((PluginClassLoader) loader); - } - } - - public static void clearClassLoader(PluginClassLoader loader) throws IllegalAccessException, IOException { - if (loader == null) return; - set(RPluginClassLoader.getFields(), loader, "plugin", null); - set(RPluginClassLoader.getFields(), loader, "pluginInit", null); - loader.close(); - } - public static Result enablePlugin(String pluginName) { return enablePlugin(Bukkit.getPluginManager().getPlugin(pluginName)); } diff --git a/src/main/java/net/frankheijden/serverutils/reflection/RPluginClassLoader.java b/src/main/java/net/frankheijden/serverutils/reflection/RPluginClassLoader.java index 0e391e0..f02d966 100644 --- a/src/main/java/net/frankheijden/serverutils/reflection/RPluginClassLoader.java +++ b/src/main/java/net/frankheijden/serverutils/reflection/RPluginClassLoader.java @@ -1,13 +1,14 @@ package net.frankheijden.serverutils.reflection; -import org.bukkit.plugin.java.PluginClassLoader; - +import java.io.IOException; import java.lang.reflect.*; +import java.net.URLClassLoader; import java.util.Map; import static net.frankheijden.serverutils.reflection.ReflectionUtils.FieldParam.fieldOf; import static net.frankheijden.serverutils.reflection.ReflectionUtils.VersionParam.ALL_VERSIONS; import static net.frankheijden.serverutils.reflection.ReflectionUtils.getAllFields; +import static net.frankheijden.serverutils.reflection.ReflectionUtils.set; public class RPluginClassLoader { @@ -16,7 +17,7 @@ public class RPluginClassLoader { static { try { - pluginClassLoaderClass = PluginClassLoader.class; + pluginClassLoaderClass = Class.forName("org.bukkit.plugin.java.PluginClassLoader"); fields = getAllFields(pluginClassLoaderClass, fieldOf("plugin", ALL_VERSIONS), fieldOf("pluginInit", ALL_VERSIONS)); @@ -25,7 +26,21 @@ public class RPluginClassLoader { } } - public static Map getFields() { - return fields; + public static boolean isInstance(Object obj) { + return pluginClassLoaderClass.isInstance(obj); + } + + public static void clearClassLoader(ClassLoader loader) throws IOException, IllegalAccessException { + if (loader == null) return; + if (isInstance(loader)) { + clearURLClassLoader((URLClassLoader) loader); + } + } + + public static void clearURLClassLoader(URLClassLoader loader) throws IllegalAccessException, IOException { + if (loader == null) return; + set(fields, loader, "plugin", null); + set(fields, loader, "pluginInit", null); + loader.close(); } }