Instances izveide, izmantojot klases nosaukumu un izsaucot konstruktoru

Vai ir veids, kā izveidot konkrētas klases eksemplāru, norādot klases nosaukumu (dinamisko) un nododot parametrus tās konstruktoram.

Kaut kas līdzīgs:

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

Kur "MyAttributeValue" ir MyClass konstruktora arguments.

Risinājums

Jā, kaut kas līdzīgs:

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

Tas, protams, darbosies tikai ar vienu virknes parametru, bet to var diezgan viegli mainīt.

Ņemiet vērā, ka klases nosaukumam jābūt pilnībā kvalificētam, t. i., ieskaitot vārdu telpu. Ja klases ir ligzdotas, ir jāizmanto dolārs (jo to izmanto kompilators). Piemēram:

package foo;

public class Outer
{
    public static class Nested {}
}

Lai iegūtu šīs Class objektu, ir nepieciešams Class.forName("foo.Outer$Nested").

Komentāri (17)

Varat izmantot Class.forName(), lai iegūtu vēlamās klases Class objektu.

Pēc tam izmantojiet getConstructor(), lai atrastu vajadzīgo Constructor objektu.

Visbeidzot, izsauciet newInstance() šim objektam, lai iegūtu savu jauno gadījumu.

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

Varat izmantot pārdomas

return Class.forName(className).getConstructor(String.class).newInstance(arg);
Komentāri (2)