Я пытаюсь создать систему событий на основе аннотаций, где вы бы зарегистрировали класс, реализующий интерфейс, а затем вы можете использовать события, которые имеют @interface над вызываемыми методами. Как так:Как создать систему событий аннотаций?
Wherever.java
EventManager.callEvent(new HelloEvent);
EventManager.register(new ClassThatImplementsListeenr);
@EventHandler
public void onHello(HelloEvent event) {
event.sayHello();
}
Хорошо, я понимаю, многое из этого, как регистрация (добавляет их в ArrayList) и делает интерфейс слушателя плюс интерфейс Event. Новые события будут выполнять Event, а @Interface - EventHandler, который будет работать только с методами. ГЛАВНАЯ часть - это то, чего я не получу. Как вызвать и проверить аннотацию.
РЕДАКТИРОВАТЬ Я ПРОСТО СДЕЛАЛ ЭТО, ЭТО РАБОТАЕТ?
Public class EventManager {
private static List<Listener> registered = new ArrayList<Listener>();
public static void register(Listener listener) {
if (!registered.contains(listener)) {
registered.add(listener);
}
}
public static void unregister(Listener listener) {
if (registered.contains(listener)) {
registered.remove(listener);
}
}
public static List<Listener> getRegistered() {
return registered;
}
public static void callEvent(final Event event) {
new Thread() {
public void run() {
call(event);
}
}.start();
}
private static void call(final Event event) {
for (Listener listener : registered) {
Method[] methods = listener.getClass().getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(EventHandler.class)) {
try {
method.invoke(listener.getClass().newInstance(), event);
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
}
}
}
как бы я призывал? – user3529775
Я бы тоже запустил поток на нем? Вызов мероприятия? – user3529775
Что значит «запустить поток на нем»? – kolossus