存在tick方法却抛出java.lang.NoSuchMethodException问题求助
问题解决:Fabric模组中反射调用tick方法抛出NoSuchMethodException
核心问题分析
- 实例方法误用静态调用逻辑:你的
test类中tick是实例方法,但代码里用invoke(null, client)尝试静态调用,不符合语法规范,同时这也是异常的诱因之一。 - 类加载器不一致:Fabric模组运行在独立的类加载器环境中,
ClassGraph默认使用系统类加载器加载类,而模组自身的类由Fabric专属类加载器加载,这会导致两个环境下的MinecraftClient类对象不相等,进而让getMethod无法匹配到目标方法签名。
修复方案
1. 修正实例方法调用逻辑
先实例化目标类,再调用实例方法(假设类存在无参构造):
try { // 实例化目标类 Object instance = classInfo.loadClass().getDeclaredConstructor().newInstance(); // 获取方法并调用 Method tickMethod = classInfo.loadClass().getMethod("tick", MinecraftClient.class); tickMethod.invoke(instance, client); } catch (Exception e) { e.printStackTrace(); }
2. 指定Fabric模组类加载器给ClassGraph
初始化ClassGraph时,指定当前模组的类加载器,确保加载的类与模组运行环境的类一致:
// 使用当前类的类加载器(即Fabric模组类加载器) ScanResult scanResult = new ClassGraph() .acceptPackages("com.stupidrepo.mydirectory.yayay") .enableClassInfo() .addClassLoader(this.getClass().getClassLoader()) // 关键:指定模组类加载器 .scan();
额外注意事项
- 如果目标类没有无参构造,需要根据实际构造方法参数调用
getDeclaredConstructor并传入对应参数完成实例化。 - 可通过打印
classInfo.loadClass().getClassLoader()和MinecraftClient.class.getClassLoader(),验证两者是否一致,确认类加载器问题是否解决。
内容的提问来源于stack exchange,提问作者WhatTheClown
相关产品推荐
相关产品推荐

