49

谷歌到处都在问这个问题,但我仍然遇到问题。这就是我想要做的。因此,就像我的标题所述,我收到“对象不是声明类的实例”错误。有任何想法吗?谢谢!

主.java

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

测试函数.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";
    }
}
4

2 回答 2

72

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

serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
于 2012-11-11T22:23:18.477 回答
17

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

这适用于static(类)方法 - 但execute它是一种非静态(实例)方法。

(它也适用于调用类型对象的实例方法Class- 但这不是你想要在这里实现的!)

您需要一个实际实例TestFunction来调用该方法,或者您需要创建该方法static

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

尽管您当前的示例方法将对任何TestFunction对象执行相同的操作,但通常实例方法可能会为每个对象产生不同的结果 - 因此.invoke()反射方法需要知道在哪个对象上运行该方法。

于 2012-11-11T22:22:54.250 回答