在以下场景中,Main.registerEvents(Listener)
是游戏API的事件系统的一部分。
假设它应该使用@EventHandler
注释注册任何方法。
public abstract class Spell implements Listener {
protected Spell() {
Main.getInstance().registerEvents(this);
}
@EventHandler
public void onMove(PlayerMoveEvent event) {
}
}
public class Fireball extends Spell {
@EventHandler
public void onChat(PlayerChatEvent event) {
}
}
一般来说,由于this
是指当前实例,Fireball.onChat(PlayerChatEvent)
如何注册?
答案 0 :(得分:5)
一般来说,由于这是指当前实例,Fireball.onChat(PlayerChatEvent)如何注册也是可能的?
因为当您构建Fireball
的实例时,this
指的是在执行时构造的Fireball
。 <{1}}的编译时类型为this
,但如果您打印出Spell
(即使在this.getClass()
构造函数中),它也会显示{ {1}}。
因此,如果Spell
查看对象的执行时类型并查找带反射的事件处理程序,则会看到Fireball
。
答案 1 :(得分:1)
在不知道API的实现的情况下,我只能猜测。
为了获得注释,必须首先使用Object.getClass()
获取适用的类。这是多态的,因此返回Fireball.class
,因此当反复搜索注释时,会找到Fireball
中找到的注释和Spell
中找到的注释。
答案 2 :(得分:0)
Fireball.onChat(PlayerChatEvent)
也已注册,因为您使用super()
,它正在调用超类的构造函数。
this
始终引用类的实例,从中调用它。
由于不存在的构造函数与您在Fireball类中使用的构造函数的等效性,您应该能够省略Fireball构造函数而不会影响结果。
因此,最后每个法术子类中的每个@EventHandler
注释方法都会被注册。