【问题标题】:Java Reflection - Object is not an instance of declaring classJava 反射 - 对象不是声明类的实例
【发布时间】:2020-03-02 18:47:44
【问题描述】:

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

Main.java

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

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";
    }
}

【问题讨论】:

    标签: java reflection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      虽然您当前的示例方法对任何 TestFunction 对象都执行相同的操作,但通常实例方法可能会为每个对象产生不同的结果 - 所以 .invoke() 反射方法需要知道哪个对象运行该方法开。

      【讨论】:

      • 确实如此,如JavaDoc 中所述。
      • 感谢您的详细解释。我希望我可以为这个问题选择多个正确答案。
      • @tkcsam - 这个想法是你选择最好的正确答案......在你看来。
      • @tkcsam - 如果你的意思是......奖励你接受的答案以外的其他答案,那么......是的,这是真的。
      • “这仅适用于静态(类)方法” - 这是不正确的,它仅适用于类 java.lang.Class 的方法。相反,要调用静态方法,必须将 obj = null 传递给 invoke
      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2017-05-05
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多