Cette question est posée partout sur Google, mais j'ai toujours des problèmes avec elle. Voici ce que j'essaie de faire. Ainsi, comme l'indique mon titre, j'obtiens une erreur "l'objet n'est pas une instance de déclaration de classe". Des idées? Merci!
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";
}
}
Vous invoquez la méthode avec la classe, mais vous en avez besoin d'une instance. Essaye ça:
serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
Vous essayez d'appeler la méthode execute
sur l'objet base
, qui est en fait un objet Class
renvoyé par votre appel Class.forName()
.
Cela ne fonctionnerait que pour une méthode static
(classe), mais execute
est une méthode non statique (instance).
Vous avez besoin d'une instance réelle de TestFunction
pour invoquer la méthode, ou vous devez créer la méthode static
.
Bien que votre exemple de méthode actuelle fasse la même chose pour tout objet TestFunction
, en général, une méthode d'instance peut produire un résultat différent pour chaque objet - la méthode de réflexion .invoke()
doit donc savoir quel objet pour exécuter la méthode.