Preguntas de la entrevista de Big Factory basadas en el mecanismo de reflexión de Java

Preguntas de la entrevista de Big Factory basadas en el mecanismo de reflexión de Java

Concepto de mecanismo de reflexión

Cuando el programa se está ejecutando, el mecanismo de reflexión de Java puede conocer todas las propiedades y métodos de esta clase para cualquier clase; para cualquier objeto, puede llamar a cualquiera de sus métodos y propiedades. Esta dinámica de acceso a la información y un método para objetos llamada dinámica funciones llamadas mecanismo de Java reflexión .

¿Por qué introducir el concepto de reflexión?

Cree que ve el concepto anterior, no hay onda en su mente, adquisición de información dinámica , método de objeto de llamada dinámica signo de interrogación negro. El siguiente código simple sirve como punto de partida para i y se explica desde la perspectiva de la máquina virtual java

  • Escribe el siguiente código
public class Main{
    public static int number = 1;
    public static void main(String args[]) {
    	System.out.println("hello World");
    }
}
  • Llame al javac Main.javacomando para Main.javacompilar el Main.classarchivo en un archivo
  • Después de ejecutar el java Maincomando, se inicia la máquina virtual java, se realiza el proceso de carga de la clase , la estructura de almacenamiento estático de la clase se almacena en el área del método y se genera un objeto java.lang.Class que representa la clase en la memoria, ya que cada una de las clases en el área del método Acceso a datos

El proceso anterior muestra que durante la fase de compilación, la clase (clase principal) que debe cargar la máquina virtual Java ya está especificada . Si su programa se está ejecutando, de repente necesita cargar la clase del servidor remoto (carga durante la operación). En este momento, el mecanismo de reflexión entra en juego.

Hay un escenario muy clásico que consiste en cargar la clase de controlador de la base de datos, solo a través de los parámetros en tiempo de ejecución puede determinar si cargar com.java.dbtest.myqlConnection(clase de controlador mysql) o cargarcom.java.dbtest.oracleConnection

En este punto, solo una simple llamada Class.forName(com.java.dbtest.myqlConnection)puede completar dinámicamente el proceso de carga de la clase.

Usa el mecanismo de reflexión para cargar la clase dos veces

import java.io.IOException;
import java.io.InputStream;
public class Main{
    public static void main(String args[]) throws Exception{
        //自定义类加载器
        ClassLoader myLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException{
                try{
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream is = getClass().getResourceAsStream(fileName);
                    if(is == null) {
                        return super.loadClass(name);
                    }
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0,  b.length);
                }catch(IOException e) {
                    throw new ClassNotFoundException(name);
                }
            }
        };
        //使用反射机制加载并实例化
        Object obj = myLoader.loadClass("Main").newInstance();

        System.out.print(obj instanceof Main);

    }
}

//结果为false

Dado que se pasa la etapa inicial 双亲委派模型, el cargador de clases de la aplicación del sistema ya ha cargado la clase. En la etapa de tiempo de ejecución, se usa un cargador de clases personalizado. Basado en el mecanismo de reflexión, la clase se carga nuevamente. Dos cargadores de clases diferentes se cargan nuevamente. Entonces, el resultado final del programa es falso.

193 artículos originales publicados · Me gustó 403 · Visitas 150,000+

Supongo que te gusta

Origin blog.csdn.net/zycxnanwang/article/details/105525658
Recomendado
Clasificación