web-dev-qa-db-fra.com

Java Reflection - L'objet n'est pas une instance de déclaration de classe

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

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>());
51
raven1981

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.

11
DNA