Java反射-对象不是声明类的实例

Java反射-对象不是声明类的实例,java,reflection,Java,Reflection,谷歌上到处都在问这个问题,但我还是有问题。这就是我要做的。就像我的标题所说的,我得到了一个“对象不是声明类的实例”错误。有什么想法吗?谢谢 Main.java Class<?> base = Class.forName("server.functions.TestFunction"); Method serverMethod = base.getMethod("execute", HashMap.class); serverMethod.invoke(base, new HashMa

谷歌上到处都在问这个问题,但我还是有问题。这就是我要做的。就像我的标题所说的,我得到了一个“对象不是声明类的实例”错误。有什么想法吗?谢谢

Main.java

Class<?> base = Class.forName("server.functions.TestFunction");
Method serverMethod = base.getMethod("execute", HashMap.class);
serverMethod.invoke(base, new HashMap<String, String>());
Class base=Class.forName(“server.functions.TestFunction”);
方法serverMethod=base.getMethod(“execute”,HashMap.class);
invoke(base,newhashmap());
TestFunction.java

package server.functions;

import java.util.HashMap;
import java.util.Map;

import server.*;

public class TestFunction extends ServerBase {

    public String execute(HashMap<String, String> params)
    {
        return "Test function successfully called";
    }
}
package server.functions;
导入java.util.HashMap;
导入java.util.Map;
导入服务器。*;
公共类TestFunction扩展了ServerBase{
公共字符串执行(HashMap参数)
{
返回“测试函数调用成功”;
}
}

您正试图调用对象
base
上的
execute
方法,该对象实际上是您的
Class.forName()调用返回的
对象

这适用于
静态
(类)方法,但
执行
是一种非静态(实例)方法

(它还可以用于调用
类型的对象的实例方法-但这不是您在这里尝试实现的!)

您需要一个
TestFunction
的实际实例来调用上的方法,或者需要使方法
成为静态的

通过反射调用静态方法时,
invoke()
的第一个参数被忽略,因此通常将其设置为
null
,这澄清了一个事实,即不涉及任何实例


虽然您当前的示例方法对任何
TestFunction
对象都会执行相同的操作,但通常情况下,实例方法会为每个对象生成不同的结果-因此
.invoke()
反射方法需要知道在哪个对象上运行该方法。

您正在使用类调用该方法,但你需要一个例子。试试这个:

serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
serverMethod.invoke(base.newInstance(),newhashmap());

确实如此,如中所述。感谢您的详细解释。我希望我能为这个问题选择多个正确答案。@tkcsam-想法是你选择最好的正确答案。。。在你看来。@tkcsam-如果你的意思是。。。奖励你接受的答案以外的其他答案,然后。。。是的,这是真的。“这只适用于静态(类)方法”-这不是真的,它只适用于类
java.lang.class
的方法。相反,要调用静态方法,必须将obj=
null
传递给
invoke