好吧,所以我基本上是在尝试为我正在从事的项目创建自己的事件/侦听器系统。我试图拥有一个系统,在其中使用抽象类创建一个事件,然后我可以创建一个侦听器,每次调用该事件时,侦听器中的代码也会被调用。这是我到目前为止所得到的:
Event.java(我将能够创建新事件的抽象类)
private String name;
private boolean cancelled;
public String getEventName() {
if (this.name == null) {
this.name = this.getClass().getSimpleName();
}
return this.name;
}
public void setName(String name) {
this.name = name;
}
public boolean isCancelled() {
return cancelled;
}
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
EventHandler.java(能够识别方法何时为侦听器的接口)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventHandler {}
Listener.java(能够识别类何时包含侦听器的接口)
public interface Listener {}
EventExecutor.java(一个将执行侦听器代码的类,我已经开始,但这是我需要帮助来调用方法来执行代码的地方)
public void execute(Class clazz){
if(!clazz.isAssignableFrom(Listener.class)) return;
for(Method method : clazz.getMethods()){
if(!method.isAnnotationPresent(EventHandler.class)) continue;
}
}
所以我要问的是,当注释存在时,我如何(在 EventExecutor 中)调用(调用)该方法。例如,该方法可以是 public void onUpdate(ProgramUpdateEvent event) 或 onClose(ProgramCloseEvent event)。谢谢任何帮助。
您实际上需要有一个侦听器的实例。您的执行方法应该如下所示:
public void execute(Listener listener) {
要调用,只需输入
method.invoke(listener, event);
第一个参数是实际调用该方法的对象,第二个参数是该方法的参数。因为这些方法不是静态的,所以您需要对该对象的引用。 (如果你让它们静态,只需放置
null
而不是监听器)
我知道我已经晚了 6 年。但如果有人仍然有他的项目需要 EventSystem 的问题,我可以推荐这个易于使用的库 https://github.com/cyklon73/JEvent