Events 什么决定了哪个事件将首先运行?

Events 什么决定了哪个事件将首先运行?,events,minecraft,bukkit,Events,Minecraft,Bukkit,我已经创建了一个测试插件作为一个科学项目来尝试并确定是否同时调用了同一事件中的两个,这将首先执行 public class TestPlugin extends JavaPlugin implements Listener { public void onEnable() { Bukkit.getPluginManager().registerEvents(this, this); } @EventHandler(priority = EventPrior

我已经创建了一个测试插件作为一个科学项目来尝试并确定是否同时调用了同一事件中的两个,这将首先执行

public class TestPlugin extends JavaPlugin implements Listener {
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }
    @EventHandler(priority = EventPriority.HIGHEST)
    public void event1(PlayerInteractEvent e) {
        System.out.println("event 1");
    }
    @EventHandler(priority = EventPriority.HIGHEST)
    public void event2(PlayerInteractEvent e) {
        System.out.println("event 2");
    }
}
插件生成的输出是

[17:01:51 INFO]: event 2
[17:01:51 INFO]: event 1

如果在类文件中首先列出event1,为什么首先触发event2?

这很难确定。因为
registerEvents
导致函数
createRegisteredListeners

在那里,他们使用一个
HashSet
来存储侦听器类的方法。因此,它们给每个存储它的方法的伪随机散列决定了哪个事件首先被注册

我不确定,但我猜每次你注册事件时,都是随机的,先注册。这就是为什么您应该使用不同的
eventPriorities
来确定首先调用哪个

如果你真的想更深入,你必须拆开我在前面的回复中发布的github链接的函数
createRegisteredListeners
。但是我想它永远不会完全确定,因为
JavaPluginLoader.java
235行中使用了
HashSet

methods=newhashset(publicMethods.length,Float.MAX_值);
当方法被添加到集合中时,永远无法确定它们在RAM中的最终位置

我希望我能帮你写这篇文章,尽管它并没有真正回答你最初的问题