From a4340ab57548806365b2f12118c997761d8260d6 Mon Sep 17 00:00:00 2001 From: LamGC Date: Sun, 22 Nov 2020 10:36:47 +0800 Subject: [PATCH] =?UTF-8?q?[Fix]=20Core,=20Framework-API=20=E5=B0=86=20Fra?= =?UTF-8?q?mework=20=E4=B8=AD=20'initial()'=20=E7=9A=84=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E5=88=B0=20FrameworkFactory=20=E4=B8=AD,=20?= =?UTF-8?q?=E4=BB=A5=E8=A7=A3=E5=86=B3=E7=B1=BB=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [Change] Framework 移除 'initial()' 的调用, 以修复类初始化过程中的一些隐式问题(如因父类尚未初始化完成, 导致子类成员变量尚未初始化, 出现 NPE 的问题); [Change] FrameworkFactory 将 Framework 的初始化转移到此, 以修复类初始化过程中的一些隐式问题(如上); --- .../cgj/bot/framework/FrameworkFactory.java | 20 ++++++++++++++----- .../lamgc/cgj/bot/framework/Framework.java | 11 ++-------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ContentGrabbingJi-core/src/main/java/net/lamgc/cgj/bot/framework/FrameworkFactory.java b/ContentGrabbingJi-core/src/main/java/net/lamgc/cgj/bot/framework/FrameworkFactory.java index 0605afa..0b3922e 100644 --- a/ContentGrabbingJi-core/src/main/java/net/lamgc/cgj/bot/framework/FrameworkFactory.java +++ b/ContentGrabbingJi-core/src/main/java/net/lamgc/cgj/bot/framework/FrameworkFactory.java @@ -65,19 +65,29 @@ final class FrameworkFactory implements PluginFactory { // 如果成功获取类, 就需要对其检查, 以确保类符合框架主类的要求. int modifiers = pluginClass.getModifiers(); - if (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers) - || (!Framework.class.isAssignableFrom(pluginClass))) { - log.error("The framework class '{}' is not valid", pluginClassName); + if (Modifier.isAbstract(modifiers) || Modifier.isInterface(modifiers)) { + log.error("The framework class '{}' is not valid: Classes are abstract, or interfaces", pluginClassName); + return null; + } else if (!Framework.class.isAssignableFrom(pluginClass)) { + log.error("The framework class '{}' is not valid: Class is not a subclass of the Framework", + pluginClassName); return null; } try { // (PluginWrapper, DataFolder) - Constructor constructor = pluginClass + Class frameworkClass = pluginClass.asSubclass(Framework.class); + Constructor constructor = frameworkClass .getConstructor(PluginWrapper.class, File.class, FrameworkContext.class); - return (Framework) constructor.newInstance(pluginWrapper, + Framework instance = (Framework) constructor.newInstance(pluginWrapper, new File(dataRootFolder, pluginWrapper.getPluginId()), new DefaultFrameworkContext(eventExecutor, cacheStoreBuilder)); + try { + instance.initial(); + } catch (Throwable e) { + throw new IllegalStateException("An exception occurred while initializing the framework", e); + } + return instance; } catch (Exception e) { log.error(e.getMessage(), e); } diff --git a/ContentGrabbingJi-framework-api/src/main/java/net/lamgc/cgj/bot/framework/Framework.java b/ContentGrabbingJi-framework-api/src/main/java/net/lamgc/cgj/bot/framework/Framework.java index f6b270b..c3e03bb 100644 --- a/ContentGrabbingJi-framework-api/src/main/java/net/lamgc/cgj/bot/framework/Framework.java +++ b/ContentGrabbingJi-framework-api/src/main/java/net/lamgc/cgj/bot/framework/Framework.java @@ -19,7 +19,6 @@ package net.lamgc.cgj.bot.framework; import org.pf4j.Plugin; import org.pf4j.PluginDescriptor; -import org.pf4j.PluginState; import org.pf4j.PluginWrapper; import java.io.File; @@ -46,18 +45,12 @@ public abstract class Framework extends Plugin { throw new IllegalStateException("Invalid description object"); } this.dataFolder = dataFolder; - try { - initial(); - } catch (Throwable e) { - wrapper.setFailedException(e); - wrapper.setPluginState(PluginState.FAILED); - log.error("An exception occurred while initializing the framework", e); - throw new IllegalStateException("An exception occurred while initializing the framework", e); - } } /** * 执行初始化操作. + *

警告: 请不要在初始化过程中调用 {@link org.pf4j.PluginManager} + * 的任何插件管理方法, 这将会导致加载错误. */ protected abstract void initial();