You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:10:16