import org.bukkit.plugin.PluginManager; //导入方法依赖的package包/类
private boolean unloadPlugin(String pluginName)
throws Exception
{
PluginManager manager = getServer().getPluginManager();
SimplePluginManager spmanager = (SimplePluginManager)manager;
if (spmanager != null) {
Field pluginsField = spmanager.getClass().getDeclaredField("plugins");
pluginsField.setAccessible(true);
List plugins = (List)pluginsField.get(spmanager);
Field lookupNamesField = spmanager.getClass().getDeclaredField("lookupNames");
lookupNamesField.setAccessible(true);
Map lookupNames = (Map)lookupNamesField.get(spmanager);
Field commandMapField = spmanager.getClass().getDeclaredField("commandMap");
commandMapField.setAccessible(true);
SimpleCommandMap commandMap = (SimpleCommandMap)commandMapField.get(spmanager);
Field knownCommandsField = null;
Map knownCommands = null;
if (commandMap != null) {
knownCommandsField = commandMap.getClass().getDeclaredField("knownCommands");
knownCommandsField.setAccessible(true);
knownCommands = (Map)knownCommandsField.get(commandMap);
}
Iterator it;
for (Plugin plugin: manager.getPlugins())
if (plugin.getDescription().getName().equalsIgnoreCase(pluginName)) {
manager.disablePlugin(plugin);
if ((plugins != null) && (plugins.contains(plugin))) {
plugins.remove(plugin);
}
if ((lookupNames != null) && (lookupNames.containsKey(pluginName))) {
lookupNames.remove(pluginName);
}
if (commandMap != null)
for (it = knownCommands.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry)it.next();
if ((entry.getValue() instanceof PluginCommand)) {
PluginCommand command = (PluginCommand)entry.getValue();
if (command.getPlugin() == plugin) {
command.unregister(commandMap);
it.remove();
}
}
}
}
}
else
{
getServer().getLogger().warning(pluginName + " is already unloaded.");
return true;
}
getServer().getLogger().info("Unloaded " + pluginName + " successfully!");
return true;
}