本帖最后由 无敌三脚猫 于 2023-3-2 22:26 编辑 
刚刚,我改我mod的字节码,改出了一句new ServerChatEvent()
new net/minecraftforge/event/ServerChatEvent
dup
invokespecial net/minecraftforge/event/ServerChatEvent <init> ()V
pop
然后,没有崩溃,也没有报错
我感觉forge可能干了什么不得了的事情,在游戏启动过程中强行给所有事件都加上了无参构造,但是为什么呢?
算了不管那个了,我现在想问问@Hueihuea是怎么发现这一神奇特性的
好了不用问了
美味的曲奇 发表于 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可能干了什么不得了的事情,在游戏启动过程中强行给所有事件都加上了无参构造,但是为什么呢?
好了不用问了
翻了一下 Forge 事件的实现,还真是。
用 ASM 给每个 Event 加了一个默认的无参构造器,因为 Forge 注册事件监听器的实现,就是用反射无参创建一个事件,好用 getListenerList 实例方法获取这个类的 ListenerList,往这个列表加监听器才算注册。和那个教程的写法一样。
但为啥不直接在 EventBus 记录一个 Map<Class<?>, ListenerList> 呢?怪哦。
用 ASM 给每个 Event 加了一个默认的无参构造器,因为 Forge 注册事件监听器的实现,就是用反射无参创建一个事件,好用 getListenerList 实例方法获取这个类的 ListenerList,往这个列表加监听器才算注册。和那个教程的写法一样。
但为啥不直接在 EventBus 记录一个 Map<Class<?>, ListenerList> 呢?怪哦。
 本帖最后由 无敌三脚猫 于 2023-3-3 10:19 编辑 
用ASM加无参构造就已经很怪了,明明可以直接写进源码的
我后来想到了一点,可能是因为有些final的成员变量,所以不能直接写无参构造
youyihj 发表于 2023-3-2 22:08
翻了一下 Forge 事件的实现,还真是。
用 ASM 给每个 Event 加了一个默认的无参构造器,因为 Forge 注册事 ...
我后来想到了一点,可能是因为有些final的成员变量,所以不能直接写无参构造