我正在为 Minecraft 编写一个使用 WorldEdit 的插件。有一个类
BlockVector3
,其方法 getBlockX()
和 getX()
已被弃用并标记为删除,将由 x()
取代。
问题是,如果我使用新方法,使用旧版本 WorldEdit 的用户将无法再使用我的插件。如果我保留已弃用的方法,它很快就会停止使用最新的依赖项来运行。
我可以编写两个不同的插件。但是,有没有办法使用反射或其他一些内省来解决这个特定问题?
有多种方法可以做到这一点。
这是一种常见的方法。大多数情况下,人们会做这样的界面:
public interface WorldEditAdapter {
void load();
void doSomething(double x, double y, double z);
}
然后,为每个版本创建一个新类,如下所示:
public class WorldEdit3 implements WorldEditAdapter {
public void load() {
// load everything related to WorldEdit 3
}
}
public class WorldEdit4 implements WorldEditAdapter {
public void load() {
// load everything related to WorldEdit 4
}
}
然后,在
onEnable()
中,先检查使用的是哪个版本,然后以new WorldEdit3()
为例实例化,然后保存为WorldEditAdapter
。现在,您的完整插件将使用 WorldEditAdapter
。
关于如何使用不可用的方法,如果你没有编译插件,也许你可以导入多个文件来“假装”2个版本的方法的存在。这可能很棘手。
您也可以像您提到的那样使用反射。这并不可取。要使用它,请执行以下操作:
myObject.getClass().getDeclaredMethod("getX").invoke(myObject); // equivalent of myObject.getX();
方法的静态调用:
MyClass.class.getDeclaredMethod("myMethod").invoke(null); // equivalent of MyClass.myMethod();
有了gradle和maven就更容易了。您可以执行解决方案 1,但将
WorldEdit3
放入由主项目加载的不同子项目中。管理起来会更容易,但这不是你的情况。