2014-07-02 4 views
1

Я пытаюсь создать систему событий на основе аннотаций, где вы бы зарегистрировали класс, реализующий интерфейс, а затем вы можете использовать события, которые имеют @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(); 
        } 
       } 
      } 
     } 
    } 
} 

ответ

0

Вы можете проверить аннотации, которые были добавлены к способу, с помощью

  1. Извлечения всех метод, которые доступны на классе:

  2. Проверьте все методы которые имеют желаемую аннотацию (хотя я бы предположил, что только один метод в любом заданном классе должен быть обозначен аннотацией типа слушателя события)

    List<Method> listenerMethods = new ArrayList<Method>(); 
    for (Method aMethod: allMethods){ 
    
        if(aMethod.isAnnotationPresent(EventHandler.class)){ 
        listenerMethods.add(aMethod); 
        } 
    
    } 
    
  3. Учитывая конкретные методы, которые содержат аннотацию, вы можете позвонить Method#invoke в список методов для запуска слушателя.

+0

как бы я призывал? – user3529775

+0

Я бы тоже запустил поток на нем? Вызов мероприятия? – user3529775

+0

Что значит «запустить поток на нем»? – kolossus

Смежные вопросы