我已经创建了一个测试插件作为科学项目,以尝试确定是否同时调用了同一事件中的2个,该事件将首先执行。
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?
答案 0 :(得分:2)
这很难确定。由于registerEvents
指向https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java的功能createRegisteredListeners
他们在其中使用HashSet
来存储您的侦听器类的方法。因此,伪随机哈希提供了每种方法来存储它,从而确定哪个事件首先被注册。
我不确定,但是我想每次您注册事件时,都是先注册的随机事件。这就是为什么您应该使用不同的eventPriorities
以确定首先调用哪个的原因。
如果您真的想更深入,则必须拆开我在此答复中较早发布的github链接的功能createRegisteredListeners
。但是我想它永远不会完全确定,因为HashSet
的{{1}}行中使用了235
:
JavaPluginLoader.java
由于将方法添加到集合中,因此无法确定它们最终在RAM中的哪个位置。
即使这篇文章并没有真正回答您的原始问题,我希望我能为您提供帮助。