Передайте .class в качестве параметра в методе (JAVA) (BUKKIT / SPIGOT) (CUSTOM EVENT SYSTEM) - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь переписать систему событий Bukkit, которую можно использовать следующим образом:

Bukkit.getPluginManager().registerEvents(new Listener() {
     @EventHandler
     public void onEvent(PlayerJoinEvent e) {
          Player player = e.getPlayer();
          player.sendMessage("Welcome!");
     }
}, this);

Однако это отнимает много времени и требует времени для записи. Чтобы улучшить свой рабочий процесс (радикально), я пытаюсь переписать эту систему во что-то гораздо более жизнеспособное и гибкое.

Вот как будет использоваться мой идеальный метод форматирования:

EventBus.register(PlayerJoinEvent.class, e -> {
     Player player = e.getPlayer();
     player.sendMessage("Welcome!");
}, this);

В настоящее время у меня есть это:

public static void register(Class<? extends Event> clazz, Consumer<Event> consumer, JavaPlugin plugin) {
     consumer.accept(clazz.newInstance());
     // Bukkit.getPluginManager().registerEvents(e, plugin); // ???

}

Моя теория состоит в том, чтобы создать более удобный класс, который реализует Listener, как показано в текущем примере использования, чтобы я мог создать его экземпляр с предоставленным Consumer<Event>.

Моя проблема в том, что мне нужно передать этот PlayerJoinEvent.class в качестве параметра в public void onEvent(<here> e) {.

Как я могу заставить это работать? С этим есть пара проблем, и я не знаю, как на этот раз превратить это из концепции в реальность.

Я не знаю, куда go сейчас, и надеюсь, что предоставил достаточно информации.

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете сделать это с помощью Generics, при этом вы можете иметь «переменную» типа в методе.

public static <T extends Event> void register(Class<T> clazz, Consumer<T> consumer, JavaPlugin plugin) {
     ...
}
...