postgres getconnection forname drivermanager java oop design-patterns reflection

java - getconnection - class.forname sql server



Inicializando una clase con Class.forName() y que tienen un constructor que toma argumentos (3)

Estoy instanciando una clase como esta.

myObj = (myObj) Class.forName("fully qualified class name here").newInstance();

Mi duda aquí es si tenemos un constructor que toma argumentos, ¿cómo podemos instanciarlo como arriba?

Gracias,
Narendra


Utilice Class.getConstructor() y llame a Constructor.newInstance() sobre eso. Por ejemplo, si este es tu constructor en la clase Foo :

public Foo(String bar, int baz) { }

Tendría que hacer algo como esto:

Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE); Foo foo = (Foo) c.newInstance("example", 34);

Deberá saber qué argumentos deben pasar al constructor. Si eso no es deseable, debería considerar tener un constructor vacío. Luego, tenga métodos para establecer lo que normalmente pasaría al constructor.

Sin embargo, uno podría preguntar si tiene el patrón correcto aquí. ¿Realmente necesita usar la reflexión, tal vez hay un mejor enfoque? Si sabes que ya vas a lanzar a tu objeto, ¿por qué no lo construyes normalmente? Es posible que desee proporcionar más contexto sobre por qué necesita hacer esto. Hay razones válidas, sin embargo, no ha indicado ninguna.


Si elige el tipo de objeto para crear según la string "fully qualified class name here" , es muy probable que pueda y debe reemplazarlo con el patrón de Estrategia .


newInstance() siempre invoca el constructor predeterminado.

si quiere invocar un constructor parametrizado,

  1. Debes obtener Constructor con tipos de parámetros pasando Class[] para getDeclaredConstructor método getDeclaredConstructor de Class
  2. Debe crear una instancia de constructor pasando Object[] para
    newInstance() de Constructor

Eche un vistazo al código de ejemplo.

import java.lang.reflect.*; class NewInstanceDemo{ public NewInstanceDemo(){ System.out.println("Default constructor"); } public NewInstanceDemo(int a, long b){ System.out.println("Two parameter constructor : int,long => "+a+":"+b); } public NewInstanceDemo( int a, long b, String c){ System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c); } public static void main(String args[]) throws Exception { NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance(); Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class}); NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2}); } }

salida:

java NewInstanceDemo Default constructor Two parameter constructor : int,long => 1:2

Eche un vistazo a la página de documentación de Oracle para más detalles.