使用Java反射时出现NoSuchMethodException

使用Java反射时出现NoSuchMethodException,java,reflection,Java,Reflection,我不知道出了什么问题,但我正在使用反射调用类内部的方法 以下是我正在做的: 类加载器和主路径已经定义。我刚把它剪掉。 类加载器是一个URLClassLoader,它有一个指向JAR文件的URL。 主路径是org.example.BlahClass Class mainClass = classLoader.loadClass(MAIN_PATH); Class[] params = new Class[] { MyClass.class }; Method method = mainClass.

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

以下是我正在做的:

类加载器和主路径已经定义。我刚把它剪掉。 类加载器是一个URLClassLoader,它有一个指向JAR文件的URL。 主路径是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)

在此处查看真正的源代码:

NoSuchMethodException
只能由
mainClass.getDeclaredMethod(“onEnable”,params)
引发。这意味着类
mainClass
没有名为
onEnable
的方法,该方法只接受一个类型为
MyClass
的参数

导致此问题的唯一一行是
classLoader.loadClass(MAIN_PATH)
,我打赌您没有加载您认为正在加载的类,即您定义了
MAIN_PATH=“org.example.BlahClass”
,但您的类
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[]
的参数,这样就可以了,因为var arg只是一个数组。但是,根据JDK的不同,它可能期望第一个参数实际上是一个数组,并且您正试图获得一个具有以下签名的方法:
onEnable(java.lang.Class[])
(它不存在)。尝试这样做:

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

NoSuchMethodException
只能由
mainClass.getDeclaredMethod(“oneable”,params)
引发。这意味着类
mainClass
没有名为
onEnable
的方法,该方法只接受一个类型为
MyClass
的参数

导致此问题的唯一一行是
classLoader.loadClass(MAIN_PATH)
,我打赌您没有加载您认为正在加载的类,即您定义了
MAIN_PATH=“org.example.BlahClass”
,但您的类
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[]
的参数,这样就可以了,因为var arg只是一个数组。但是,根据JDK的不同,它可能期望第一个参数实际上是一个数组,并且您正试图获得一个具有以下签名的方法:
onEnable(java.lang.Class[])
(它不存在)。尝试这样做:

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


您尝试调用的方法是静态的吗?错误是什么?如果您将类定义、实际方法名称和参数放在此处会有所帮助。请向我们展示您试图调用的方法的声明。该类实际上被称为
?不要那样做。换句话说,这不是真正的代码。所以发布它完全是浪费时间。你试图调用的方法是静态的吗?错误是什么?如果您将类定义、实际方法名称和参数放在此处会有所帮助。请向我们展示您试图调用的方法的声明。该类实际上被称为
?不要那样做。换句话说,这不是真正的代码。因此,发布它完全是浪费时间。该类位于另一个文件中。(URLClassLoader)如果我一起删除参数,包括类的接口和类,它就可以工作了。@CatSources抱歉,我弄糊涂了。如果你删除了一个声明了方法的类,它怎么工作呢?对不起,只是措辞不正确。如果不删除类,请删除类和接口中的参数。包括不使用参数调用它。@CatSources您是否尝试过这样做
mainClass.getDeclaredMethod(“onEnable”,MyClass.class)
?该类位于另一个文件中。(URLClassLoader)如果我一起删除参数,包括类的接口和类,它就可以工作了。@CatSources抱歉,我弄糊涂了。如果你删除了一个声明了方法的类,它怎么工作呢?对不起,只是措辞不正确。如果不删除类,请删除类和接口中的参数。包括不使用参数调用它。@CatSources您是否尝试过这样做
mainClass.getDeclaredMethod(“onEnable”,MyClass.class)