Ответ 1
Вы вызываете метод с классом, но вам нужен его экземпляр. Попробуйте следующее:
serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
Этот вопрос задают везде в 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";
}
}
Вы вызываете метод с классом, но вам нужен его экземпляр. Попробуйте следующее:
serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
Вы пытаетесь вызвать метод execute
для объекта base
, который на самом деле является объектом Class
, возвращаемым вашим вызовом Class.forName()
.
Это будет работать только для метода static
(class), но execute
- это нестатический (экземпляр) метод.
Вам нужен фактический экземпляр TestFunction
для вызова метода, или вам нужно сделать метод static
.
Хотя ваш метод текущего примера будет делать то же самое для любого объекта TestFunction
, в общем случае метод экземпляра может дать другой результат для каждого объекта, поэтому метод отражения .invoke()
должен знать, какой объект запускать метод на.