2012-11-11 12 views
23

To pytanie jest zadawane wszędzie w Google, ale wciąż mam z tym problemy. Oto, co próbuję zrobić. Tak jak w moim tytule, otrzymuję komunikat "Obiekt nie jest instancją deklarowania klasy". Jakieś pomysły? Dzięki!Java Reflection - Obiekt nie jest instancją deklarującą klasę

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

Odpowiedz

37

Wywołujesz metodę z klasą, ale potrzebujesz jej instancji. Spróbuj tego:

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

Działa doskonale. Dzięki – tier1

+0

właśnie to, czego potrzebowałem, dziękuję! –

10

Próbujesz wywołać metodę execute na obiekcie base, która jest faktycznie Class obiekt zwrócony przez wywołanie Class.forName().

To będzie działać tylko dla metody static (klasa), ale execute jest metodą niestatyczną (instancja).

Potrzebujesz rzeczywistej instancji TestFunction, aby uruchomić tę metodę, lub musisz wykonać metodę static.

Chociaż obecna metoda przykład zrobiłaby to samo dla dowolnego obiektu TestFunction, ogólnie metoda instancji może wytworzyć inny wynik dla każdego obiektu - tak więc metoda refleksyjna .invoke() musi wiedzieć, na którym obiekcie uruchomić tę metodę.

+0

dla metod statycznych można również dostarczyć 'null' ... –

+0

Tak, rzeczywiście, jak to opisano w [JavaDoc] (http://docs.oracle.com/javase/6/docs/ api/java/lang/reflect/Method.html # invoke% 28java.lang.Object,% 20java.lang.Object ...% 29). – DNA

+0

Dzięki za szczegółowe wyjaśnienie. Chciałbym móc wybrać wiele poprawnych odpowiedzi na to pytanie. – tier1

Powiązane problemy