Class PluginManager
UltiTools模块管理器
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate ClassLoaderprivate PlayerCacheManagerprivate final List<Class<? extends UltiToolsPlugin>> private final List<UltiToolsPlugin> private TaskManager -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate booleanvoidclose()Unregister all plugins.private String[]getPluginScanPackages(Class<? extends UltiToolsPlugin> pluginClass) Get scan packages for a plugin class.private booleanhasNewerVersionLoaded(UltiToolsPlugin plugin) 判定是否已经加载了同一模块的更新版本。**只判定,不改动已加载的模块。**voidinit(ClassLoader classLoader) Initialize plugin manager.private UltiToolsPlugininitializePlugin(ClassLoader classLoader, Class<? extends UltiToolsPlugin> pluginClass, Object... constructorArgs) Initialize module.private booleanisSafeParameterType(Class<?> clazz) Check if parameter type is safe for constructor injection.private booleanprivate Class<? extends UltiToolsPlugin> loadPluginMainClass(ClassLoader classLoader, File pluginJar) Load module main class.private voidonPluginRegistered(UltiToolsPlugin plugin) private booleanCompatibility gates that must run before the module's bean graph is built.booleanregister(UltiToolsPlugin plugin) booleanregister(Class<? extends UltiToolsPlugin> pluginClass) Register plugin.booleanregister(Class<? extends UltiToolsPlugin> pluginClass, String pluginName, String version, List<String> authors, List<String> loadAfter, int minUltiToolsVersion, String mainClass) Register plugin.private voidregisterBukkit(UltiToolsPlugin plugin, boolean flag) Register bukkit commands or listeners.voidregisterExternal(ExternalPluginAdapter adapter) Register an external Bukkit plugin adapter with the framework.private voidregisterModuleEventHandlers(EventBus eventBus, UltiToolsPlugin plugin, Object bean) Scan a bean for @ModuleEventHandler methods and register them with the EventBus.private voidregisterModuleEventHandlersExternal(EventBus eventBus, String pluginName, Object bean) Scan a bean for @ModuleEventHandler methods and register them with EventBus for an external plugin.private voidRegister a Bukkit listener for PlayerQuitEvent to clean up @PlayerCache maps.private voidRegister a Bukkit listener for PluginDisableEvent to auto-disconnect external plugins.voidreload()Reload all plugins.private voidsetPluginStaticInstance(Class<? extends UltiToolsPlugin> pluginClass, UltiToolsPlugin plugin) Set the static instance field on a plugin class before @PostConstruct runs.private List<Class<? extends UltiToolsPlugin>> sortPluginsByDependencies(List<Class<? extends UltiToolsPlugin>> plugins) Sort plugins by their dependencies using Kahn's algorithm (topological sort).voidunregister(UltiToolsPlugin plugin) voidunregisterExternal(ExternalPluginAdapter adapter) Unregister an external Bukkit plugin adapter from the framework.private void卸掉被本次加载取代的旧版本。private booleanvalidateConstructorArgs(Object... args) Validate constructor arguments for security.private booleanvalidateJarFile(File jarFile) Validate jar file security.
-
Field Details
-
pluginList
-
pluginClassList
-
classLoader
-
taskManager
-
playerCacheManager
-
-
Constructor Details
-
PluginManager
public PluginManager()
-
-
Method Details
-
init
Initialize plugin manager. Please do not call this method manually.
初始化插件管理器。请不要手动调用此方法。- Throws:
IOException- IO exception
IO异常
-
register
Register plugin.
注册插件。- Parameters:
pluginClass- Plugin class
插件类- Returns:
- Register result
注册结果
-
register
public boolean register(Class<? extends UltiToolsPlugin> pluginClass, String pluginName, String version, List<String> authors, List<String> loadAfter, int minUltiToolsVersion, String mainClass) Register plugin.
注册插件。- Parameters:
pluginClass- UltiTools plugin class
UltiTools模块类pluginName- Plugin name
插件名称version- Plugin version
插件版本authors- Plugin authors
插件作者loadAfter- Load after plugins
加载在此插件之后的插件minUltiToolsVersion- Min UltiTools version
最低UltiTools版本mainClass- Main class
主类- Returns:
- Register result
注册结果
-
register
- Parameters:
plugin- UltiTools plugin instance
UltiTools模块实例- Returns:
- Register result
注册结果
-
unregister
- Parameters:
plugin- UltiTools plugin instance
UltiTools模块实例
-
close
public void close()Unregister all plugins.
注销所有插件。 -
registerPlayerQuitListener
private void registerPlayerQuitListener()Register a Bukkit listener for PlayerQuitEvent to clean up @PlayerCache maps.
注册 Bukkit 监听器,在玩家退出时清理 @PlayerCache 标注的 Map。 -
registerPluginDisableListener
private void registerPluginDisableListener()Register a Bukkit listener for PluginDisableEvent to auto-disconnect external plugins.
注册 Bukkit 监听器,在外部插件禁用时自动断开连接。- Since:
- 6.2.2
-
reload
public void reload()Reload all plugins. This operation only reload plugin configuration.
重载所有插件。此操作仅会重新加载插件配置。 -
loadPluginMainClass
private Class<? extends UltiToolsPlugin> loadPluginMainClass(ClassLoader classLoader, File pluginJar) Load module main class.
加载模块主类。- Parameters:
classLoader- Class loader
类加载器pluginJar- Plugin jar file
模块jar文件- Returns:
- Plugin main class
模块主类
-
validateJarFile
Validate jar file security.
验证jar文件安全性。- Parameters:
jarFile- jar file to validate
要验证的jar文件- Returns:
- true if valid, false otherwise
如果有效则为true,否则为false
-
passesCompatibilityGates
Compatibility gates that must run before the module's bean graph is built.
必须跑在模块 bean 图构建之前的兼容性门禁。这两道门禁原先跑在
initializePlugin之后,也就是容器refresh()、整张 bean 图连同@PostConstruct都已经跑完之后。倒置的后果正好落在它们唯一有意义的 场景上:针对更新 API 编译的模块,恰恰是那种 bean 会引用不存在方法的模块,它会先死在refresh()里,被通用 catch 报成一条普通的初始化失败,而「UltiTools 版本过旧」 那句友好提示永远说不出口。见 issue #184。门禁只读
plugin.yml里来的元数据(api-version/main/version),这些在实例构造完就已经就位,不需要容器。- Parameters:
plugin- freshly constructed plugin instance, context not yet attached
刚构造出来、还没挂上容器的插件实例- Returns:
- true if the module may proceed to context construction
允许继续建容器则为 true
-
hasNewerVersionLoaded
判定是否已经加载了同一模块的更新版本。**只判定,不改动已加载的模块。**卸掉被本次加载取代的旧版本是另一件事,见
unregisterSupersededVersions(com.ultikits.ultitools.abstracts.UltiToolsPlugin)。 两者拆开是因为判定要提前到 bean 构造之前,而卸载不能——提前卸载会让「新版本初始化失败」 变成「服务器上两个版本都没有」。 -
unregisterSupersededVersions
卸掉被本次加载取代的旧版本。只能在新模块的
registerSelf()返回 true 之后调用——不是「容器建好之后」。 两者差着一步:容器建好只说明 bean 图能构造,模块尚未激活;而registerSelf()返回 false 或抛异常时,调用方会关掉新容器。若旧版本已经在此之前被卸,这个模块就 两头落空,而它原本正在正常运行。 -
isUltiToolsVersionCompatible
-
attemptPluginRegistration
-
onPluginRegistered
-
registerModuleEventHandlers
Scan a bean for @ModuleEventHandler methods and register them with the EventBus. -
initializePlugin
private UltiToolsPlugin initializePlugin(ClassLoader classLoader, Class<? extends UltiToolsPlugin> pluginClass, Object... constructorArgs) Initialize module.
初始化模块。- Parameters:
classLoader- Class loader
类加载器pluginClass- Plugin class
插件类constructorArgs- Constructor arguments
构造器参数- Returns:
- the initialized module, or
nullif a compatibility gate rejected it
初始化好的模块;被兼容性门禁拒绝时返回null
-
validateConstructorArgs
Validate constructor arguments for security.
验证构造器参数的安全性。- Parameters:
args- constructor arguments
构造器参数- Returns:
- true if safe, false otherwise
如果安全则为true,否则为false
-
isSafeParameterType
Check if parameter type is safe for constructor injection.
检查参数类型是否对构造器注入安全。- Parameters:
clazz- parameter class
参数类- Returns:
- true if safe, false otherwise
如果安全则为true,否则为false
-
registerBukkit
Register bukkit commands or listeners.
注册Bukkit命令或监听器。- Parameters:
plugin- UltiTools module instance
UltiTools模块实例flag- True if register in default package
如果在默认包中注册则为true
-
setPluginStaticInstance
private void setPluginStaticInstance(Class<? extends UltiToolsPlugin> pluginClass, UltiToolsPlugin plugin) Set the static instance field on a plugin class before @PostConstruct runs. Most modules follow the pattern: private static XxxPlugin instance; This enables @PostConstruct methods to call Xxx.getInstance().getDataOperator() etc.
在 @PostConstruct 运行之前设置插件类的静态 instance 字段。- Parameters:
pluginClass- the plugin class
插件类plugin- the plugin instance
插件实例
-
getPluginScanPackages
Get scan packages for a plugin class. Reads from @UltiToolsModule or @ComponentScan annotations, defaults to plugin class package.
获取插件类的扫描包。- Parameters:
pluginClass- plugin class
插件类- Returns:
- scan packages
扫描包
-
sortPluginsByDependencies
private List<Class<? extends UltiToolsPlugin>> sortPluginsByDependencies(List<Class<? extends UltiToolsPlugin>> plugins) Sort plugins by their dependencies using Kahn's algorithm (topological sort).
使用 Kahn 算法(拓扑排序)按依赖关系对插件进行排序。- Parameters:
plugins- list of plugin classes to sort
要排序的插件类列表- Returns:
- sorted list of plugin classes
排序后的插件类列表
-
registerExternal
Register an external Bukkit plugin adapter with the framework. Creates an IoC container, scans for annotated components, and registers commands/listeners/tasks.注册外部 Bukkit 插件适配器到框架中。 创建 IoC 容器,扫描注解组件,并注册命令、监听器和定时任务。
- Parameters:
adapter- the external plugin adapter- Since:
- 6.2.2
-
unregisterExternal
Unregister an external Bukkit plugin adapter from the framework. Tears down the IoC container, unregisters commands/listeners, and cleans up resources.从框架中注销外部 Bukkit 插件适配器。 拆除 IoC 容器,注销命令和监听器,并清理资源。
- Parameters:
adapter- the external plugin adapter- Since:
- 6.2.2
-
registerModuleEventHandlersExternal
Scan a bean for @ModuleEventHandler methods and register them with EventBus for an external plugin.
-