为我的API创建自己的事件处理程序和事件

时间:2019-02-08 08:35:43

标签: java bukkit

我正在为其他游戏编写API,因此我想创建事件以便更轻松地使用,例如,我查看了spigot(Minecraft)是如何做到的,并将其追溯到作为接口的EventExecutor。< / p>

public interface EventExecutor {
    public void execute(Listener listener, Event event) throws EventException;
}

所以现在我迷路了,我已经看到了RegisteredListener类和HandlerList,但不太了解事件是如何自动获取PlayerMessages的?

我正在为已经玩了几年的游戏创建自定义API。

到目前为止,我还没有任何代码,目前正在研究并试图了解Spigot如何进行事件以及如何为我的API创建事件。

我希望能够创建

之类的活动
public void onLogEntry(LogEntryEvent event) {
   event.getEventName();
   event.getStarSystem();
}

1 个答案:

答案 0 :(得分:1)

Spigot处理事件的方式基于反射。 每当您将对象注册为侦听器时,都会对其进行反思性分析,以查找标注为@EventHandler并需要一个Event子类型的参数的非静态方法。 可以使用listenerObject.getClass().getDeclaredMethods()然后对其进行过滤(例如,使用Java的Stream API)。 之后,将这些方法添加到某个集合(在Spigot的情况下是有序的)或一个键为事件类型且值是侦听器方法引用的multimap。 通过调用事件管理器的fire-event方法来调用事件,该方法导致类型有效的相关方法的调用。使用Method#invoke(Event)完成此操作 但是,使用Java的MethodHandles API甚至Lambdametafactory都是一个不错的选择