无敌三脚猫
本帖最后由 无敌三脚猫 于 2023-3-2 22:26 编辑
美味的曲奇 发表于 2023-3-2 17:43
Nashorn 调用无参构造会报出
TypeError: Can not create new object with constructor ClassA with the pas ...

刚刚,我改我mod的字节码,改出了一句new ServerChatEvent()
new net/minecraftforge/event/ServerChatEvent
dup
invokespecial net/minecraftforge/event/ServerChatEvent <init> ()V
pop
然后,没有崩溃,也没有报错
我感觉forge可能干了什么不得了的事情,在游戏启动过程中强行给所有事件都加上了无参构造,但是为什么呢?
算了不管那个了,我现在想问问@Hueihuea是怎么发现这一神奇特性的
好了不用问了

youyihj
翻了一下 Forge 事件的实现,还真是。
用 ASM 给每个 Event 加了一个默认的无参构造器,因为 Forge 注册事件监听器的实现,就是用反射无参创建一个事件,好用 getListenerList 实例方法获取这个类的 ListenerList,往这个列表加监听器才算注册。和那个教程的写法一样。

但为啥不直接在 EventBus 记录一个 Map<Class<?>, ListenerList> 呢?怪哦。

无敌三脚猫
本帖最后由 无敌三脚猫 于 2023-3-3 10:19 编辑
youyihj 发表于 2023-3-2 22:08
翻了一下 Forge 事件的实现,还真是。
用 ASM 给每个 Event 加了一个默认的无参构造器,因为 Forge 注册事 ...

用ASM加无参构造就已经很怪了,明明可以直接写进源码的
我后来想到了一点,可能是因为有些final的成员变量,所以不能直接写无参构造

第一页 上一页