Что определяет, какое событие будет запущено первым? - PullRequest
2 голосов
/ 08 мая 2019

Я создал тестовый плагин в качестве научного проекта, чтобы попытаться определить, вызваны ли 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

, если событие1 указано первым в файле класса, почему событие2 запускается первым?

1 Ответ

2 голосов
/ 08 мая 2019

Это очень сложно определить.Поскольку registerEvents ведет к функции createRegisteredListeners из https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java

Там они используют HashSet для хранения методов вашего класса слушателя.Таким образом, псевдослучайный хэш, который они дают каждому методу для его хранения, определяет, какое событие регистрируется первым.

Я не уверен, но я предполагаю, что каждый раз, когда вы регистрируете события, это своего рода случайность, котораярегистрируется первым.Вот почему вы должны использовать разные eventPriorities, чтобы определить, какой из них вызывается первым.

Если вы действительно хотите углубиться, вы должны разорвать функцию createRegisteredListeners ссылки GitHub, которую я разместил ранее.в этом ответе.Но я думаю, что это никогда не будет полностью определенным из-за HashSet, используемого в строке 235 JavaPluginLoader.java:

methods = new HashSet<Method>(publicMethods.length, Float.MAX_VALUE);

Поскольку методы добавляются в набор, никогда не определено, в какой позициив оперативной памяти они заканчиваются.

Я надеюсь, что смогу помочь вам с этим постом, хотя он не отвечает на ваш первоначальный вопрос.

...