¿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?

Author: Ravindra babu, 2010-08-26

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!

 83
Author: mwittrock,
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);
 9
Author: Jothi,
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,

  1. Tienes que obtener Constructor con tipos de parámetros pasando tipos en Class[] para getDeclaredConstructor método de Class
  2. Debe crear una instancia de constructor pasando valores en Object[] para
    newInstance método de Constructor

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
 3
Author: Ravindra babu,
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 ().

 0
Author: reshmi reddy,
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