Czy istnieje sposób utworzenia instancji określonej klasy, biorąc pod uwagę nazwę klasy (dynamiczną) i przekazać parametry do jej konstruktora.
Coś jak:
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Gdzie "MyAttributeValue"
jest argument do konstruktora MyClass
.
java
reflection
instantiation
TheLameProgrammer
źródło
źródło
newInstance()
jest metodą varargs (podobnie jakGetConstructor()
), nie ma potrzebyObject
tworzenia jawnych tablic.Object[]
argument, wolę utworzyć tablicę jawnie w tym przypadku.Możesz użyć,
Class.forName()
aby uzyskaćClass
obiekt pożądanej klasy.Następnie użyj,
getConstructor()
aby znaleźć żądanyConstructor
obiekt.Na koniec wywołaj
newInstance()
ten obiekt, aby uzyskać nową instancję.źródło
Możesz użyć odbić
źródło
Class.forName(className).getConstructor().newInstance();
;)Jeśli klasa ma tylko jeden pusty konstruktor (np. Activity lub Fragment itp., Klasy Androida):
źródło
Constructor<?> ctor = clazz.getConstructor(String.class)
chyba nie działało dla mnie.przy użyciu (tj.)
getConstructor(String.lang)
konstruktor musi zostać zadeklarowany jako publiczny. W przeciwnym razieNoSuchMethodException
wyrzucane jest a .jeśli chcesz uzyskać dostęp do niepublicznego konstruktora , musisz go użyć (tj
getDeclaredConstructor(String.lang)
. ) .źródło
Chcesz używać java.lang.reflect.Constructor.newInstance (Object ...)
źródło
Bardzo prosty sposób na utworzenie obiektu w Javie przy użyciu
Class<?>
argumentów konstruktora:Przypadek 1: - Tutaj jest mały kod w tej
Main
klasie:A oto
Base
struktura klas:Przypadek 2: - Możesz kodować podobnie dla konstruktora z wieloma argumentami i konstruktorem kopiowania. Na przykład przekazanie konstruktorowi 3 argumentów jako parametru
Base
będzie wymagało utworzenia konstruktora w klasie i zmiany kodu powyżej:I tutaj klasa podstawowa powinna jakoś wyglądać:
Uwaga: - Nie zapomnij obsługiwać różnych wyjątków, które muszą być obsługiwane w kodzie.
źródło
Jeśli ktoś szuka sposobu na utworzenie instancji klasy, mimo że klasa jest zgodna ze Wzorem Singletona, oto sposób na zrobienie tego.
Działa to tylko w przypadku klas, które implementują wzorzec singletonu za pomocą prywatnego konstruktora.
źródło
Możesz także wywoływać metody wewnątrz utworzonego obiektu.
Możesz utworzyć obiekt natychmiast, wywołując pierwszy konstruktor, a następnie wywołać pierwszą metodę w utworzonym obiekcie.
źródło
String
jako parametr? Staje się trochę niechlujny, kiedy zmieniasz kolejność konstruktorówgetConstructor(ClassName.class)
Myślę, że nadal jest lepiej. Nawet jeśli kolejność konstruktorów zmienia się w klasie, nie trzeba ręcznie szukać pozycjiKolejna pomocna odpowiedź. Jak korzystać z getConstructor (params) .newInstance (args)?
W moim przypadku konstruktor mojej klasy przyjmuje jako parametr Webdriver, więc użyłem go poniżej:
źródło