好的,所以我基本上是在尝试为我正在进行的项目创建自己的事件/监听器系统。我正在尝试建立一个使用抽象类创建事件的系统,然后我可以创建一个监听器,每次调用该事件时,也会调用监听器中的代码。这是我到目前为止所得到的:
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事件)或onClose(ProgramCloseEvent事件)。谢谢任何帮助表示赞赏。
答案 0 :(得分:1)
您需要实际拥有侦听器的实例。您的执行方法应如下所示:
public void execute(Listener listener) {
要调用,只需输入
即可method.invoke(listener, event);
第一个参数是实际调用方法的对象,第二个参数是方法的参数。因为这些方法不是静态的,所以需要对该对象的引用。 (如果你把它们设为静态,只需要放置null
而不是听众)