gpt4 book ai didi

java - 使用 Java 反射时出现 NoSuchMethodException

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:13 25 4
gpt4 key购买 nike

我不知道出了什么问题,但我正在使用反射来调用类内部的方法。

这就是我正在做的事情:

ClassLoader 和 MAIN_PATH 已定义。我刚把它剪掉了。ClassLoader 是一个 URLClassLoader,并且有一个 JAR 文件的 URL。MAIN_PATH 是 org.example.BlahClass

Class mainClass = classLoader.loadClass(MAIN_PATH);
Class[] params = new Class[] { MyClass.class };
Method method = mainClass.getDeclaredMethod("onEnable", params);
MyClass myClass = new MyClass();
method.invoke(null, myClass);

该方法在此类中声明:

public class BlahClass implements SomeInterface {
public void onEnable(MyClass myClass){}
public void onDisable(){}
}

完整的堆栈跟踪:

    [17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: java.lang.NoSuchMethodException: org.example.Main.commenced(org.rocket.plugin.events.PluginInitializationEvent)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.Class.getDeclaredMethod(Class.java:2130)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at org.rocket.plugin.java.RocketPluginLoader.func_01321(RocketPluginLoader.java:42)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at org.rocket.RocketMod.setup(RocketMod.java:41)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.reflect.Method.invoke(Method.java:497)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.reflect.Method.invoke(Method.java:497)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.post(EventBus.java:275)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.reflect.Method.invoke(Method.java:497)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at com.google.common.eventbus.EventBus.post(EventBus.java:275)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.Loader.serverStarting(Loader.java:781)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraftforge.fml.common.FMLCommonHandler.handleServerStarting(FMLCommonHandler.java:319)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraft.server.dedicated.DedicatedServer.startServer(DedicatedServer.java:289)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500)
[17:58:11] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:748]: at java.lang.Thread.run(Thread.java:745)

在这里查看真正的来源:https://gitlab.com/PizzaCrust/Rocket/blob/master/Rocket/src/org/rocket/plugin/java/RocketPluginLoader.java

最佳答案

NoSuchMethodException只能由 mainClass.getDeclaredMethod("onEnable", params) 抛出。这意味着类 mainClass没有名为 onEnable 的方法它采用 MyClass 类型的单个参数.

唯一可能导致此问题的行是 classLoader.loadClass(MAIN_PATH)我敢打赌,您没有加载您认为正在加载的类,即您定义 MAIN_PATH = "org.example.BlahClass"但是你的类(class)BlahClass不在包装中 org.example 。另一个原因可能与 classLoader 有关。 - 您也没有展示如何初始化它。

尝试添加以下检查:

if (mainClass == org.example.BlahClass.class) {
System.out.println("It's ok!");
} else {
System.out.println("It's not ok!");
}

另一个原因可能与params有关。 。 getDeclaredMethod第二个参数是 var-arg - Class<?>... parameterTypes 。您传递 Class[] 类型的单个参数所以应该没问题,因为 var-arg 只是一个数组。但是,根据 JDK,它可能期望第一个参数实际上是一个数组,并且您正在尝试获取具有以下签名的方法:onEnable(java.lang.Class[])相反(不存在)。尝试这样做:

mainClass.getDeclaredMethod("onEnable", MyClass.class)

关于java - 使用 Java 反射时出现 NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com