Class.forName NoSuchMethodException

Class.forName NoSuchMethodException
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0

Witam,
Mam problem z tego typu kodem. Wyrzuca NoSuchMethodException.

Kopiuj
Class<?> cls = Class.forName("Nazwa klasy");
   Method setNameMethod = cls.getClass().getMethod(nazwaFunkcji, int[].class);
   setNameMethod.invoke(cls,  new int[]{2, 5});


vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Pytanie jak wygląda docelowa klasa?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
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 :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
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 :)

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

}
 
edytowany 2x, ostatnio: maf2
TR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:731
0

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


musica curat corpus at animam
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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?
Kopiuj
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;
    }

}
 

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
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?
Kopiuj
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.

edytowany 1x, ostatnio: maf2
Shalom
O RLY? Bo ja widze że jednak działa. Oczywiście nic nie wypisuje bo w swoim kodzie też nic nie wypisywałeś, ale tak poza tym to się wykonuje.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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

edytowany 1x, ostatnio: vpiotr
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0

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

M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0

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

M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0

Ok a jak bym chciał zrobić coś takiego czyli tablice:

Kopiuj
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.

edytowany 1x, ostatnio: maf2
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
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.

edytowany 1x, ostatnio: maf2

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.