Crear una instancia utilizando el nombre de la clase y llamando al constructor

¿Existe una manera de crear una instancia de una clase particular dado el nombre de la clase (dinámica) y pasar parámetros a su constructor.

Algo así como

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

Donde "MiAtributoValor"es un argumento del constructor deMiClase`.

Solución

Sí, algo así:

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

Eso sólo funcionará para un único parámetro de cadena, por supuesto, pero puedes modificarlo con bastante facilidad.

Tenga en cuenta que el nombre de la clase tiene que ser completamente calificado, es decir, incluyendo el espacio de nombres. Para las clases anidadas, es necesario utilizar un dólar (ya que es lo que utiliza el compilador). Por ejemplo:

package foo;

public class Outer
{
    public static class Nested {}
}

Para obtener el objeto Class para eso, usted'necesitaría Class.forName("foo.Outer$Nested").

Comentarios (17)

Puede utilizar Class.forName() para obtener un objeto Class de la clase deseada.

A continuación, utilice getConstructor() para encontrar el objeto Constructor deseado.

Finalmente, llama a newInstance() sobre ese objeto para obtener tu nueva instancia.

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

Puedes utilizar los reflejos

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