Szukałem pytania: Utwórz instancję klasy na podstawie jej nazwy ciągu, która opisuje, jak utworzyć instancję klasy, mając jej nazwę. Czy można to zrobić w Javie? Będę mieć nazwę pakietu i nazwę klasy i muszę mieć możliwość utworzenia obiektu o tej konkretnej nazwie.
java
string
object
instantiation
ict1991
źródło
źródło
Odpowiedzi:
Dwie drogi:
Metoda 1 - tylko dla klas posiadających konstruktor bezargumentowy
Jeśli Twoja klasa ma konstruktor bez argumentów, możesz uzyskać
Class
obiekt zaClass.forName()
pomocąnewInstance()
metody i użyć tej metody do utworzenia instancji (chociaż uważaj, że ta metoda jest często uważana za złą, ponieważ może pokonać sprawdzone wyjątki Javy).Na przykład:
Metoda 2
Alternatywnym bezpieczniejszym podejściem, które działa również, jeśli klasa nie ma żadnych konstruktorów bez argumentów, jest
Constructor
wysłanie zapytania do obiektu klasy w celu pobrania obiektu i wywołanianewInstance()
metody na tym obiekcie:Obie metody znane są jako odbicie . Zazwyczaj będziesz musiał wychwycić różne wyjątki, które mogą wystąpić, w tym takie jak:
źródło
newInstance()
, czy moglibyśmy rzucić go z powrotem na nasz własny obiekt?instance
sięcom.foo.MyClass
? biorąc pod uwagę, że com.foo.MyClass to tylko ciąg znakówźródło
use Class.forName ("String nazwa klasy"). newInstance ();
Spowoduje to zainicjowanie klasy o nazwie A.
źródło
Aby ułatwić uzyskanie w pełni kwalifikowanej nazwy klasy w celu utworzenia instancji za pomocą
Class.forName(...)
, można skorzystać zClass.getName()
metody. Coś jak:Następnie możesz rzucić obiekt, do którego wracasz, z powrotem do dowolnej klasy, do której przejdziesz
makeObject(...)
:źródło
clazz.newInstance()
zamiastgetName
wtedyfromName
?Użyj odbicia Java
Tworzenie nowych obiektów Nie ma odpowiednika wywołania metody dla konstruktorów, ponieważ wywołanie konstruktora jest równoznaczne z utworzeniem nowego obiektu (aby być bardziej precyzyjnym, utworzenie nowego obiektu wymaga zarówno alokacji pamięci, jak i konstrukcji obiektu). Zatem najbliższy odpowiednik poprzedniego przykładu to:
która znajduje konstruktora, który obsługuje określone typy parametrów i wywołuje go, aby utworzyć nowe wystąpienie obiektu. Wartość tego podejścia polega na tym, że jest czysto dynamiczne, z wyszukiwaniem konstruktora i wywoływaniem w czasie wykonywania, a nie w czasie kompilacji.
źródło
Class.forName („ClassName”) rozwiąże Twój cel.
źródło
źródło
coś takiego powinno działać ...
źródło
Używanie
newInstance()
bezpośrednie jest przestarzałe od wersji Java 8. Należy używaćClass.getDeclaredConstructor(...).newInstance(...)
z odpowiednimi wyjątkami.źródło