わかりました、これは説明するのがかなり紛らわしいです。私は自分のベストを尽くす。
@EventHandler を使用するだけで void をイベント ハンドラーにすることができる Bukkit Event System に触発されました。
例:
@EventHandler
public void aRandomName(PlayerMoveEvent ev) {
}
ご覧のとおり、メソッドの名前は重要ではありません。どのイベントが渡されるかは、イベント引数の型によって決まります。
すべてのイベントは Event クラスを拡張します。1 つのことを除いて、動作すると思われるコードを作成しました。
public List<Object> eventContainers;
public void fireEvent(Event e) {
Method[] methods;
for (Object o : eventContainers) {
Object[] classes = o.getClass().getClasses();
for (Object clss : classes) {
methods = clss.getClass().getMethods();
for (Method m : methods) {
if (m.getAnnotation(EventHandler.class) != null) {
try {
Class[] requiredTypes = m.getParameterTypes();
for(Class cl : requiredTypes) {
if(e.equals(cl)) {
m.invoke(clss, e);
}
}
} catch (IllegalAccessException ex) {
} catch (IllegalArgumentException ex) {
} catch (InvocationTargetException ex) {
}
}
}
}
}
}
私のコードは何をしますか: eventContainers 内のすべてのクラスをループし、@EventHandler アノテーションを持つメソッドを探し、指定されたイベントをそのメソッドに送信します。ただし、fireEvent(Event e) で指定されたイベントがどのようなイベントであるかを確認し、その種類のイベント パラメーターを必要とするメソッドを調べたいと考えています。どうすればいいですか?私はそれを理解します
Class[] requiredTypes = m.getParameterTypes();
for(Class cl : requiredTypes) {
if(e.equals(cl)) {
m.invoke(clss, e);
}
}
動作しないでしょう。
最終的には、イベントをプラグインに渡すことができるようにしたいと考えています。このような:
EventManager.fireEvent(new PlayerMoveEvent(player));
これは、すべてのプラグインとプラグインに送信されます
@EventHandler
public void aVoid(PlayerMoveEvent e) {
//stuff
}
ご不明な点がございましたら、より適切に説明できるよう努めます。よろしくお願いします。