Kiedy używać użyć Class.forName("SomeImpl")
, jesteś uzyskania klasę poprzez bieżącego classloader (tj program ładujący klasy, do którego wywoływana jest metoda).Będzie także initialize klasa. Jest to skutecznie to samo, co wywołanie Class.forName("SomeImpl", true, currentLoader)
, gdzie currentLoader
byłby programem ładującym klasy wywołującego. Zobacz szczegóły here.
Druga metoda wymaga najpierw wybrania modułu ładującego klasy. Nie pisz tego jako ClassLoader.loadClass("SomeImpl")
, ponieważ jest to metoda statyczna. Można by wymagać czegoś podobnego
final ClassLoader cl = this.getClass().getClassLoader();
Class theClass = cl.loadClass("SomeImpl");
pamiętać, że podklasy ClassLoader powinien zastąpić metodę findClass zamiast loadClass
. Jest to to samo, co wywołanie metody (chronionej), gdzie drugi argument wskazuje, czy należy wykonać łączenie, czy nie.
Są bardziej subtelne różnice ... Metoda loadClass
oczekuje binarnego nazwa klasy określone przez specyfikację języka Java, a forName
może być również stosowana z ciągami reprezentujących prymitywnych typów lub klas tablicy.
Kilka, najlepiej jest użyć Class.forName
, w razie potrzeby określając konkretny moduł ładujący klasy i czy musi on być intializowany, czy nie, pozwól implementacji wykombinować resztę. Używanie programów ładujących klasy bezpośrednio jest dobre do znajdowania zasobów w słoiku lub ścieżce klas.
Osobiście staram się nie używać literalnych ciągów znaków w moim kodzie ... Zastanów się nad wpisaniem 'SomeImpl.class.getSimpleName()' zamiast literału o napiętym kodzie (oszczędza głowy podczas zmiany nazwy klasy). – Yuval
@ Yuval: Zazwyczaj zgadzam się z tobą, ale w przypadku 'Class.forName()' * cały punkt * jest taki, że przekazujesz mu ciąg znaków. Jeśli masz instancję 'Class', nie musisz wywoływać 'Class.forName()'. A jeśli możesz napisać 'SomeImpl.class', możesz napisać' new SomeImpl() 'zamiast używać w ogóle refleksji. –
@Jeval, dynamiczne ładowanie klas jest podstawową funkcją w Javie i nie ma nic wspólnego z użyciem łańcucha zamiast klasy. [RE. Pryden już to obejmuje] – bestsss