2010-07-15 15 views

Respuesta

1

Su propósito es para cargar dinámicamente la definición de la clase especificada por el nombre completo se pasa como argumento de cadena .

Esto significa que la JVM buscará eficazmente el archivo .class dentro de los elementos classpath y luego con newInstance() solicitará una nueva instancia de esa clase.

Si la clase ya se había cargado antes, entonces ya está en la memoria caché y no se recuperará nuevamente del archivo. (no estoy seguro al 100%, tal vez se le permite "actualizar" una definición de clase en tiempo de ejecución, pero personalmente creo que crearía inconsistencias)

3

Carga el controlador MySQL JDBC.

La razón por la que hace esto es que no directamente utilice esta clase, por lo que no hay enlaces estáticos al nombre de la clase. Cuando intenta abrir una conexión de base de datos, simplemente usa un java.sql.Connection y no una clase o interfaz específica de MySQL. Esa traducción se realiza detrás de las escenas con carga de clase dinámica.

Está cargando esa clase para que pueda registrarse en el subsistema JDBC para cuando realice la conexión posteriormente.

8

Utiliza la reflexión para buscar en el classpath de una clase llamada "com.mysql.jdbc.Driver" y crea una nueva instancia de la misma.

En su código cuando se escribe

Integer foo = new Integer() 

en su lugar podría escribir

Integer foo = Class.forName("java.lang.Integer").newInstance() 

Pero ¿por qué ir a todo este problema? Debido a que desea cargar el controlador de la base de datos en tiempo de ejecución, no codificarlo duro. Por lo tanto, si cambia las bases de datos, simplemente cambia un archivo de configuración que cargaría un controlador de base de datos diferente. En su caso específico, puede que no importe, pero abre nuevas posibilidades en la configuración de la base de datos (y este Class.forName jazz es la forma en que generalmente se hace)

+0

Bueno, está codificado de todos modos. Como una cadena, pero necesita compilar de nuevo para cambiar el controlador. En Java 6 y JDBC 4, ya no es necesario, como se puede ver aquí: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se- 6.html. – kolrie

1

Una llamada a Class.forName ("X") hace que la clase llamada X se cargue dinámicamente (en tiempo de ejecución).

1

Cuando ejecuta el programa Java, tiene la ruta de acceso de clases y la ubicación predeterminada para recoger algunos archivos jar (contienen clases) y clases. La JVM cargará todas esas jarras (contienen clases) y clases para preparar el inicio de su programa Java.

Class.forName ("className") busca en todas estas clases cargadas para devolver el "nombre de clase" particular para que puedas crear una instancia/objeto a partir de él.

Es una dinámica forma de hacer lo mismo que en tiempo de compilación objeto de instancias:

ClassName classInstance = new ClassName(); 
+0

Por dinámico, significa que la cadena "className" se puede generar/proporcionar en función de la interacción del usuario con el programa (consola o gui u otras formas dinámicas). Aunque en el ejemplo de esta pregunta, "com.mysql.jdbc.Driver" es una cadena codificada. – ttchong

7

Casi con toda seguridad, com.mysql.jdbc.Driver tiene un inicializador estático que tiene este aspecto:

static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())}; 

Este inicializador estático se llama cuando se utiliza el método deforName. Entonces, sin darte cuenta, registraste el controlador MySQL.

En cuanto a newInstance, no sé por qué está allí. Parece innecesario

+0

Por cierto, el uso de "Class.forName" ya no es necesario. El controlador podría encontrar el controlador sin él: http://download-llnw.oracle.com/javase/6/docs/api/java/sql/DriverManager.html – OscarRyz

+0

En la documentación de MySQL- http: // dev .mysql.com/doc/refman/5.5/es/connector-j-usagenotes-connect-drivermanager.html hay una referencia a que .newInstance() es una solución para implementaciones Java rotas. –

-1

Class.forName(String name)

devuelve el objeto de clase asociado a la clase [...] el nombre de cadena dado

Eso significa, que, devolvería (o intento) para volver la clase com.mysql.jdbc.Driver

tarde Class.newInstace()

crea una nueva instancia de la clase representada por este objeto [...]

Por lo tanto, lo que hace esa línea, es crear dinámicamente una instancia de MySQL conductor.

Este:

Class.forName ("com.mysql.jdbc.Driver").newInstance(); 

sería equivalente a:

import java.sql.Driver; 
.... 
Driver driver = new com.mysql.jdbc.Driver() 

Por cierto acuerdo con DriverManager doc, que no tiene que usarlo nunca más:

Las aplicaciones ya no necesitan cargar explícitamente los controladores JDBC usando Class.forName()

Se solía necesitar para cargar el controlador, pero ahora el DriverManager usa otra estrategia.

Por último, leer el:

NOTA: La interfaz DataSource, nueva en el API JDBC 2.0, proporciona otra manera de conectarse a una fuente de datos. El uso de un objeto DataSource es el medio preferido para conectarse a una fuente de datos.

1

Class.forName se utiliza para cargar el objeto de clase para el nombre de clase completo especificado. Cuando el objeto, aquí se refiere a com.mysql.jdbc.Driver, se carga, se llamará a la expresión estática.Entonces, aunque Class.newInstance() no se invoca para crear una nueva instancia, debe haber alguna inicialización estática en com.mysql.jdbc.Driver.

Cuestiones relacionadas