我正在尝试使用事件调度程序来允许模型在更改时通知订阅的侦听器。事件分派器接收一个处理程序类和一个方法名称,以便在分派期间调用。演示者订阅模型更改并提供要在更改时调用的 Handler 实现。
这是代码(对不起,它有点长)。
事件分配器:
package utils;
public class EventDispatcher<T> {
List<T> listeners;
private String methodName;
public EventDispatcher(String methodName) {
listeners = new ArrayList<T>();
this.methodName = methodName;
}
public void add(T listener) {
listeners.add(listener);
}
public void dispatch() {
for (T listener : listeners) {
try {
Method method = listener.getClass().getMethod(methodName);
method.invoke(listener);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
模型:
package model;
public class Model {
private EventDispatcher<ModelChangedHandler> dispatcher;
public Model() {
dispatcher = new EventDispatcher<ModelChangedHandler>("modelChanged");
}
public void whenModelChange(ModelChangedHandler handler) {
dispatcher.add(handler);
}
public void change() {
dispatcher.dispatch();
}
}
模型更改处理程序:
package model;
public interface ModelChangedHandler {
void modelChanged();
}
主持人:
package presenter;
public class Presenter {
private final Model model;
public Presenter(Model model) {
this.model = model;
this.model.whenModelChange(new ModelChangedHandler() {
@Override
public void modelChanged() {
System.out.println("model changed");
}
});
}
}
主要的:
package main;
public class Main {
public static void main(String[] args) {
Model model = new Model();
Presenter presenter = new Presenter(model);
model.change();
}
}
现在,我希望收到“模型已更改”的消息。但是,我得到一个 java.lang.IllegalAccessException: Class utils.EventDispatcher can't access a member of class presenter.Presenter$1 with modifiers "public"。
我知道要责备的类是我在演示者内部创建的匿名类,但是我不知道如何使它比现在更“公开”。如果我用一个命名的嵌套类替换它,它似乎可以工作。如果 Presenter 和 EventDispatcher 在同一个包中,它也可以工作,但我不能允许(不同包中的几个 Presenter 应该使用 EventDispatcher)
有任何想法吗?