Witam,
Mam problem z tego typu kodem. Wyrzuca NoSuchMethodException.
Class<?> cls = Class.forName("Nazwa klasy");
Method setNameMethod = cls.getClass().getMethod(nazwaFunkcji, int[].class);
setNameMethod.invoke(cls, new int[]{2, 5});
Chyba jasno ci java mówi że klasa o podanej nazwie nie ma podanej metody. W czym problem?
Shalom napisał(a):
Chyba jasno ci java mówi że klasa o podanej nazwie nie ma podanej metody. W czym problem?
No w tym, że taka metoda w tej klasie jest :)
To nam ja teraz pokaż tutaj i ci wtedy powiemy czemu jednak nie ma.
Ok to daję taki przykładowy kod który wyrzuca błąd o którym mowa. Pewnie jakiś prosty bład tylko przez moje niezrozumienie tematu to wynika :)
import java.lang.reflect.Method;
public class reflection {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("reflection");
Method setNameMethod = cls.getClass().getMethod("cosliczy", int.class);
int D = (int)setNameMethod.invoke("cosliczy", 2);
}
public int cosliczy(int i){ return i;}
}
jakiś inny kod może, bo ten wywala ClassNotFoundException
No robisz źle bo:
Class<T>
a następnie na nim wołasz getClass
czyli pobierasz referencje do metaklasy dla Class
;]import java.lang.reflect.Method;
public class Reflection {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("Reflection");
Method setNameMethod = cls.getMethod("cosliczy", int.class);
int smallDomain = (int) setNameMethod.invoke(cls.newInstance(), 2);
}
public int cosliczy(int i) {
return i;
}
}
Shalom napisał(a):
No robisz źle bo:
- Pobierasz sobie obiekt
Class<T>
a następnie na nim wołaszgetClass
czyli pobierasz referencje do metaklasy dlaClass
;]- To jest metoda OBIEKTU a nie klasy więc musisz utworzyć obiekt i na nim wołać a nie że jakiegoś stringa tam podajesz do invoke. WTF?
import java.lang.reflect.Method;
public class Reflection {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("Reflection");
Method setNameMethod = cls.getMethod("cosliczy", int.class);
int d = (int) setNameMethod.invoke(cls.newInstance(), 2);
}
public int cosliczy(int i) {
return i;
}
}
Ten poprawiony kod też nie działa.
Litości, to jest przecież banalny temat.
Wystarczyło wyguglać to: "java Method invoke", wynik:
https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html
Ok a jak bym chciał zrobić coś takiego czyli tablice:
import java.lang.reflect.Array;
import java.lang.reflect.Method;
public class Reflection {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("Reflection");
Method setNameMethod = cls.getMethod("cosliczy", int[].class);
setNameMethod.invoke(cls.newInstance(), new int[]{2,3,4});
}
public static void cosliczy(int[] i){
System.out.println("Liczba i = " + i);
}
W sumie jest przykład jakis w podanym linku więc może wydumam.
Teraz robisz źle bo metoda jest statyczna. Czy ty w ogóle masz jakies pojęcie o javie? Bo refleksja to jest zaawansowany mechanizm a ja mam wrażenie że ty nawet porządnie hello world nie ogarniasz.
Strasznie jesteś drażliwy. Można zamknąć już sobie poradziłem. Wyobraź sobie, że jednak hello world ograniam a refleksje to dla mnie coś nowego. Mam nadzieję, że nie uczysz dla dobra uczących się:) Mimo wszysko dziękuję za pomoc można zamknąć temat.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.
Shalom