[Change] Framework-API 调整 Framework 内存储 PluginWrapper 的方式, 以防 Plugin 内的 wrapper 遭到更改;

[Change] Framework 添加 _wrapper 字段, 用于保存 PluginWrapper 并防止 Plugin 内的 wrapper 遭到更改(但是依然没办法防止 'getWrapper()' 返回错误的 PluginWrapper);
This commit is contained in:
LamGC 2021-02-21 20:31:47 +08:00
parent 68f13a38c1
commit f945b52fa4
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D

View File

@ -32,6 +32,11 @@ public abstract class Framework extends Plugin {
private final File dataFolder; private final File dataFolder;
private final FrameworkContext context; private final FrameworkContext context;
/**
* 这个变量是防止原 {@link Plugin#wrapper} 遭到修改而存在.
* <p> 很迷惑为什么 {@link Plugin#getWrapper()} 加了 {@code final} 关键字而 {@link Plugin#wrapper} 却不添加 {@code final} 关键字.
*/
private final PluginWrapper _wrapper;
/** /**
* FrameworkManager 执行的构造方法. * FrameworkManager 执行的构造方法.
@ -43,6 +48,7 @@ public abstract class Framework extends Plugin {
*/ */
public Framework(PluginWrapper wrapper, File dataFolder, FrameworkContext context) { public Framework(PluginWrapper wrapper, File dataFolder, FrameworkContext context) {
super(wrapper); super(wrapper);
this._wrapper = wrapper;
this.context = context; this.context = context;
if (!(wrapper.getDescriptor() instanceof FrameworkDescriptor)) { if (!(wrapper.getDescriptor() instanceof FrameworkDescriptor)) {
throw new IllegalStateException("Invalid description object"); throw new IllegalStateException("Invalid description object");
@ -77,11 +83,12 @@ public abstract class Framework extends Plugin {
* @return 返回框架描述对象. * @return 返回框架描述对象.
*/ */
public final FrameworkDescriptor getDescriptor() { public final FrameworkDescriptor getDescriptor() {
PluginDescriptor descriptor = getWrapper().getDescriptor(); PluginDescriptor descriptor = _wrapper.getDescriptor();
if (descriptor instanceof FrameworkDescriptor) { if (descriptor instanceof FrameworkDescriptor) {
return (FrameworkDescriptor) descriptor; return (FrameworkDescriptor) descriptor;
} }
throw new ClassCastException("无法转换 Descriptor 的类型, 框架管理器可能遭到修改!"); throw new ClassCastException("无法转换 Descriptor 的类型, " +
"可能是第三方 FrameworkManager 并未传入 FrameworkDescriptor 或 FrameworkManager 遭到修改!");
} }
/** /**
@ -111,7 +118,7 @@ public abstract class Framework extends Plugin {
* @return 返回资源输入流, 如果资源不存在时返回 {@code null}. * @return 返回资源输入流, 如果资源不存在时返回 {@code null}.
*/ */
protected final InputStream getFrameworkResourceAsStream(String name) { protected final InputStream getFrameworkResourceAsStream(String name) {
return getWrapper().getPluginClassLoader().getResourceAsStream(name); return _wrapper.getPluginClassLoader().getResourceAsStream(name);
} }
} }