¿Crear una instancia de un objeto de clase con constructor que acepte un parámetro de cadena?
Me gustaría crear una instancia de un objeto a partir de su objeto Class
, utilizando el constructor que acepta un único argumento String
.
Aquí hay un código que se acerca a lo que quiero:
Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();
Sin embargo, crea una instancia del objeto JLabel
sin texto. Me gustaría usar el constructor JLabel
que acepta una cadena como texto inicial. ¿Hay una manera de seleccionar un constructor específico de un objeto Class
?
4 answers
Class.newInstance
invoca el constructor no-arg (el que no toma ningún parámetro). Para invocar un constructor diferente, necesita usar el paquete reflection (java.lang.reflect
).
Obtenga una instancia Constructor
como esta:
Class<?> cl = Class.forName("javax.swing.JLabel");
Constructor<?> cons = cl.getConstructor(String.class);
La llamada a getConstructor
especifica que desea el constructor que toma un único parámetro String
. Ahora para crear una instancia:
Object o = cons.newInstance("JLabel");
Y ya está.
P.d. Solo utilice la reflexión como último recurso!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 10:49:04
Lo siguiente funcionará para usted. Prueba esto,
Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel");
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-09 14:40:34
Class.forName("className").newInstance()
siempre invoca ningún argumento constructor predeterminado.
Para invocar constructor parametrizado en lugar del argumento cero constructor no-arg,
- Tienes que obtener
Constructor
con tipos de parámetros pasando tipos enClass[]
paragetDeclaredConstructor
método deClass
- Debe crear una instancia de constructor pasando valores en
Object[]
paranewInstance
método deConstructor
Código de ejemplo:
import java.lang.reflect.*;
class NewInstanceWithReflection{
public NewInstanceWithReflection(){
System.out.println("Default constructor");
}
public NewInstanceWithReflection( String a){
System.out.println("Constructor :String => "+a);
}
public static void main(String args[]) throws Exception {
NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class});
NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});
}
}
Salida:
java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-11 15:41:26
Algunas veces no es necesario crear un objeto para que la clase llame a constructores y métodos is. Puede llamar a métodos de clase sin crear objeto directo. Es muy fácil llamar a un constructor con parámetro.
import java.lang.reflect.*;
import java.util.*;
class RunDemo
{
public RunDemo(String s)
{
System.out.println("Hello, I'm a constructor. Welcome, "+s);
}
static void show()
{
System.out.println("Hello.");
}
}
class Democlass
{
public static void main(String args[])throws Exception
{
Class.forName("RunDemo");
Constructor c = RunDemo.class.getConstructor(String.class);
RunDemo d = (RunDemo)c.newInstance("User");
d.show();
}
}
La salida será:
Hola, soy un constructor. Bienvenido, Usuario
Hola.
Clase.forName ("RunDemo"); cargará la clase RunDemo.
Constructor c = RunDemo.clase.getConstructor (String.clase); El método getConstructor () de la clase Constructor devolverá el constructor que tiene String como Argumento y su referencia se almacena en el objeto 'c' de la clase Constructor.
RunDemo d = (RunDemo) c. newInstance("User"); el método newInstance () de la clase Constructor instanciará la clase RundDemo y devolverá la versión Genérica de object y se convertirá en tipo RunDemo usando Type casting.
El objeto ' d ' de RunDemo contiene la referencia devuelta por el Método newInstance ().
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-03 04:53:28