Oprettelse af en instans ved at bruge klassens navn og kalde konstruktøren

Er der en måde at oprette en instans af en bestemt klasse på, hvis man angiver klassens navn (dynamisk) og overfører parametre til dens konstruktør.

Noget i stil med:

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

Hvor "MyAttributeValue" er et argument til konstruktøren af MyClass.

Løsning

Ja, noget i retning af:

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

Det virker selvfølgelig kun for en enkelt strengparameter, men du kan ændre det ret nemt.

Bemærk, at klassens navn skal være fuldt kvalificeret, dvs. inklusive namespace. For indlejrede klasser skal du bruge en dollar (da det er det, som compileren bruger). For eksempel:

package foo;

public class Outer
{
    public static class Nested {}
}

For at få objektet Class til dette, skal du bruge Class.forName("foo.Outer$Nested").

Kommentarer (17)

Du kan bruge Class.forName() til at få et Class objekt af den ønskede klasse.

Brug derefter getConstructor() til at finde det ønskede Constructor-objekt.

Til sidst kalder du newInstance() på dette objekt for at få din nye instans.

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
Kommentarer (0)

Du kan bruge refleksioner

return Class.forName(className).getConstructor(String.class).newInstance(arg);
Kommentarer (2)