diff --git a/src/main/java/cn/citycraft/Yum/manager/PluginsManager.java b/src/main/java/cn/citycraft/Yum/manager/PluginsManager.java index 443c104..596e55b 100644 --- a/src/main/java/cn/citycraft/Yum/manager/PluginsManager.java +++ b/src/main/java/cn/citycraft/Yum/manager/PluginsManager.java @@ -14,6 +14,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -507,6 +509,7 @@ public class PluginsManager { List plugins = null; Map lookupNames = null; Map knownCommands = null; + Map fileAssociations = null; if (pluginManager == null) { sender.sendMessage("§4异常: §c插件管理类反射获取失败!"); return false; @@ -524,9 +527,13 @@ public class PluginsManager { commandMapField.setAccessible(true); commandMap = (SimpleCommandMap) commandMapField.get(pluginManager); - final Field knownCommandsField = SimpleCommandMap.class.getDeclaredField("knownCommands"); + final Field knownCommandsField = commandMap.getClass().getDeclaredField("knownCommands"); knownCommandsField.setAccessible(true); knownCommands = (Map) knownCommandsField.get(commandMap); + + final Field fileAssociationsField = pluginManager.getClass().getDeclaredField("fileAssociations"); + fileAssociationsField.setAccessible(true); + fileAssociations = (Map) fileAssociationsField.get(pluginManager); } catch (final Exception e) { sender.sendMessage("§4异常: §c" + e.getMessage() + " 插件 §b" + name + " §c卸载失败!"); return false; @@ -564,6 +571,16 @@ public class PluginsManager { ((URLClassLoader) cl).close(); } catch (final IOException ex) { } + if (fileAssociations != null) { + for (final Iterator> filter = fileAssociations.entrySet().iterator(); filter.hasNext();) { + final Entry entry = filter.next(); + final Matcher match = entry.getKey().matcher(getPluginFile(next).getName()); + if (match.find()) { + filter.remove(); + sender.sendMessage("§6卸载: §a移除插件 §b" + name + " §a的类加载器!"); + } + } + } System.gc(); } }