user3529775
user3529775

Reputation: 21

How do I make an annotation based event system?

Well I already made one but I don't know if it's the best tbh. Can anyone write me a good tutorial? I made this one with a tutorial and I understood 90% of it but 10% of off and it seems this aint the best way to do it.

EventManager.java

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() {
            @Override
            public void run() {
                call(event);
            }
        }.start();
    }

    private static void call(final Event event) {
        for (Listener registered : getRegistered()) {
            Method[] methods = registered.getClass().getMethods();

            for (int i = 0; i < methods.length; i++) {
                EventHandler eventHandler = methods[i].getAnnotation(EventHandler.class);
                if (eventHandler != null) {
                    Class<?>[] methodParams = methods[i].getParameterTypes();

                    if (methodParams.length < 1) {
                        continue;
                    }

                    if (!event.getClass().getSimpleName().equals(methodParams[0].getSimpleName())) {
                        continue;
                    }

                    try {
                        methods[i].invoke(registered.getClass().newInstance(), event);
                    } catch (Exception exception) {
                        System.err.println(exception);
                    }
                }
            }
        }
    }
}

EventHandler.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface EventHandler {    
}

and Event.java and Listener.java are blank interfaces.

Upvotes: 0

Views: 1760

Answers (0)

Related Questions