Pytanko o Class.forName

0

Hej,

Możliwe że jest to głupie pytanie ale muszę je zadać, a mianowicie czemu nie można w javie użyć takiej konstrukcji :>

Class<SomeClass> cl = Class<SomeClass>.forName(className);
0

Ja od innej strony nieco, podwaze sens takiego zapisu: skoro masz w tej linijce SomeClass, czyli nazwe klasy, to po co chcesz ja ladowac dynamicznie, i przechodzic przez caly mechanizm refleksji?

A co do pytania: 1. metoda forName nie jest parametryzowana typem, zajrzyj w kod albo api 2. metoda forName zwraca Class<?>, czyli nieznana klase, a ty chcesz przypisac do Class<someclass> - moze jakbys to poprawnie zapisal to bys mial pewnosc ze zwracana klasa jest SomeClass, ale kompilator tego nie wie 3. przypisanie Class<?> do Class<SomeClass> jest jak przypisanie obiektu typu Object do referencji na SomeClass - pewnie wiesz ze to jest niedozwolone poniewaz to jest rozszerzanie typu. Mozesz sobie rzutowac.
Zapis ? wraz ze slowkami extends i super sa opisane w wielu miejscach w necie, poczytaj.

0

Klasę można pobrać tak:

  1. Class<?> cl = Class<?>.forName(className);
  2. SomeClass.class - gdy znana jest w czasie kompilacji
  3. obj.getClass() - gdy chcemy pobrać klasę obiektu

Tylko w przypadku 2. wiadomo w czasie kompilacji o jaką klasę chodzi.
W przypadku 3. nie wiadomo z powodu dziedziczenia.

np.
Number n = Integer.valueOf(42);
System.out.println(n.getClass().getSimpleName());

Spowoduje to wypisanie "Integer", nie "Number".

0

Przyklad pierwszy sie nie kompiluje. 1. powtorze jeszcze raz: Class.forName nie jest metoda generyczna. Zwraca obiekt klasy ktora jest generyczna 2. jesli juz metoda jest generyczna, to ostre nawiasy stawia sie po kropce np Collections.<String>emptyList() 3. nawet jesli zalozymy ze forName jest generycne, postawimy nawiasy ostre po kropce, to i tak nie mozna tak wywolac bo nie wolno w takim wywolaniu uzywac wildcardow 4. wywolania metod starycznych nigdy nie biora parametryw generycznych przy nazwie klasy

0

Czepiasz się. :-P ;)

0

Odpowiadam na pytanie ;-) Jesli odebrales cos nie tak to przepraszam, nie mialem zamiaru sie czepiac, tylko wyprowstowac to i owo.

0

ja również mam pytanie o Class.forName, co prawda inne, ale chyba nie ma sensu zakładania nowego tematu..

Czy istnieje możliwość dynamicznego ładowania klas ze sparametryzowanym konstruktorem??

0

w momencie kiedy ladujesz klasy, nie masz jeszcze zadnego zwiazku z konstruktorem. Dopiero jak tworzysz instancje klasy to wolasz konstruktor. I tak, mozna wolac konstruktor z parametrami:
Class<?> c = Class.forName("jakas.klasa"); Constructor<?> cons = c.getConstructor(String.class, String.class);
cons.newInstance("param1", "param2");

c.getConstructor() to funkcja z varargs czyli mozesz tam zadeklarowac ile chcesz parametrow, ktore moga miec jakiekolwiek typy - ale taki konstruktor musi rzeczywiscie istniec. Wywolanie bierze parametry z jakimi chcesz ten konstruktor wywolac, i musza odpowadac poszczegolnym typom.

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