Class.forName NoSuchMethodException

0

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


0

Pytanie jak wygląda docelowa klasa?

0

Chyba jasno ci java mówi że klasa o podanej nazwie nie ma podanej metody. W czym problem?

0
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 :)

0

To nam ja teraz pokaż tutaj i ci wtedy powiemy czemu jednak nie ma.

0

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

}
 
0

jakiś inny kod może, bo ten wywala ClassNotFoundException

0

No robisz źle bo:

  1. Pobierasz sobie obiekt Class<T> a następnie na nim wołasz getClass czyli pobierasz referencje do metaklasy dla Class ;]
  2. 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 smallDomain = (int) setNameMethod.invoke(cls.newInstance(), 2);
    }

    public int cosliczy(int i) {
        return i;
    }

}
 
0

Źle to robisz.
Javadoc mówi że do metody "invoke" należy przekazać jako pierwszy argument instancję klasy, do której ta metoda należy, następnie argumenty.

0
Shalom napisał(a):

No robisz źle bo:

  1. Pobierasz sobie obiekt Class<T> a następnie na nim wołasz getClass czyli pobierasz referencje do metaklasy dla Class ;]
  2. 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.

0

Litości, to jest przecież banalny temat.

http://ideone.com/syO8ho

Wystarczyło wyguglać to: "java Method invoke", wynik:
https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

0

Ok ok bez stresu własnie czytam ale linki się przydadzą.

0

Ok działa wszystko już mi się oczy od tego plącza i głupoty robię :) Dziękuję za pomoc.

0

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.

0

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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1