删除方法后如何支持较旧的 Java 依赖项?

问题描述 投票:0回答:1

我正在为 Minecraft 编写一个使用 WorldEdit 的插件。有一个类

BlockVector3
,其方法
getBlockX()
getX()
已被弃用并标记为删除,将由
x()
取代。

问题是,如果我使用新方法,使用旧版本 WorldEdit 的用户将无法再使用我的插件。如果我保留已弃用的方法,它很快就会停止使用最新的依赖项来运行。

我可以编写两个不同的插件。但是,有没有办法使用反射或其他一些内省来解决这个特定问题?

java reflection minecraft
1个回答
0
投票

有多种方法可以做到这一点。

  1. 每个版本一个类,棘手但简单。

这是一种常见的方法。大多数情况下,人们会做这样的界面:

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();
  1. Gradle/Maven:子项目

有了gradle和maven就更容易了。您可以执行解决方案 1,但将

WorldEdit3
放入由主项目加载的不同子项目中。管理起来会更容易,但这不是你的情况。

© www.soinside.com 2019 - 2024. All rights reserved.