Saltar al contenido

¿Cómo funciona Class.forName ()?

Solución:

Class.forName simplemente carga una clase, incluida la ejecución de sus inicializadores estáticos, como este:

class Foo {
    static {
        System.out.println("Foo initializing");
    }
}

public class Test {
    public static void main(String [] args) throws Exception {
        Class.forName("Foo");
    }
}

Todo el resto del procedimiento del que está hablando es específico de JDBC. El conductor, que implementa Driver, no se extiende DriverManager – simplemente registra una instancia apropiada usando DriverManager.registerDriver. Entonces cuando DriverManager necesita encontrar un controlador para una cadena de conexión en particular, llama connect en cada controlador registrado a su vez hasta que uno tenga éxito y devuelva una conexión no nula.

Tenga en cuenta que esta forma de registrar controladores es razonablemente anticuada; consulte los documentos para DriverManager para obtener formas más modernas de acceder a una fuente de datos.

Cuando creamos una instancia de una clase usando un operador nuevo, hace dos cosas

  1. Cargue la clase en la memoria, si no está cargada, lo que significa crear una representación en memoria de la clase a partir del archivo .class para que se pueda crear una instancia a partir de ella. Esto incluye la inicialización de variables estáticas (resolución de esa clase)
  2. cree una instancia de esa clase y almacene la referencia a la variable.

Class.forName hace solo lo primero. Carga la clase en la memoria y devuelve esa referencia como una instancia de Class. Si queremos crear una instancia, podemos llamar al método newInstance de esa clase. que invocará el constructor predeterminado (sin constructor de argumentos). Tenga en cuenta que si no se puede acceder al constructor predeterminado, el método newInstance arrojará un IllegalAccessException. y si la clase es una clase o interfaz abstracta o no tiene un constructor predeterminado, arrojará un InstantiationException. Si surge alguna excepción durante la resolución de esa clase, arrojará una ExceptionInInitializerError.

Si el constructor predeterminado no está definido, entonces tenemos que invocar el constructor defiend usando la API de reflexión.

Pero la principal ventaja de Class.forName es que puede aceptar el nombre de la clase como un argumento String. Entonces podemos pasar el nombre de la clase de forma dinámica. Pero si creamos una instancia de una clase usando un operador nuevo, el nombre de la clase no se puede cambiar dinámicamente.

Class.forName() inturn llamará al método loadClass del llamador ClassLoader (ClassLoder de la clase desde donde Class.forName se invoca).

Por defecto, el Class.forName() resolver esa clase. lo que significa, inicializar todas las variables estáticas dentro de esa clase. Lo mismo se puede cambiar utilizando el método sobrecargado de Class.forName(String name,boolean initialize,ClassLoader loader)

La razón principal para cargar el controlador jdbc usando Class.forName() es decir, el controlador puede cambiar dinámicamente. en el bloque estático, todos los controladores crearán una instancia de sí mismos y registrarán esa clase con DriverManager usando DriverManager.registerDriver() método. Desde el Class.forName(String className) por defecto resuelve la clase, inicializará el inicializador estático. Entonces cuando llamamos Class.forName("com.sun.jdbc.odbc.JdbcOdbcDriver"), la clase Driver se cargará, instanciará y se registrará con DriverManager

Entonces, si está utilizando un nuevo operador, debe hacer lo siguiente.
Código:

Driver drv = new com.sun.jdbc.odbc.JdbcOdbcDriver();
DriverManager.registerDriver(drv);

Class.forName(..) carga e inicializa la clase de destino. Esto a su vez significa que se invocan los bloques inicializadores estáticos (código definido en static { .. }.

Si observa, por ejemplo, el controlador de MySQL, en ese bloque estático el controlador se registra a sí mismo: DriverManager.registerDriver(new Driver());

Puede omitir el Class.forName(..) y registre el controlador usted mismo si puede “permitirse” la dependencia en tiempo de compilación del controlador de MySQL.

Dicho esto, rara vez será relevante usar Class.forName(..) para inicializar clases desde su aplicación, porque la dependencia en tiempo de compilación no es un problema allí.

También tenga en cuenta que Class.forName(..) ya no es necesario para JDBC desde la versión 4. Al utilizar el mecanismo del proveedor de servicios, puede indicar al administrador de controladores qué debe cargar mediante una propiedad del sistema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *