¿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 de
MiClase`.
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")
.
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");