Reflexión de Java: el alma del framework

Reflexión: el alma de diseño del marco

  • Marco: software semiacabado. El desarrollo de software se puede llevar a cabo sobre la base del marco, lo que simplifica la codificación

    Antes de comprender el concepto de reflexión, primero debemos comprender las tres etapas por las que pasa el código Java en la computadora, como se muestra a continuación.
    Inserte la descripción de la imagen aquí

  • Reflexión: encapsula los diversos componentes de la clase en otros objetos. Este es el mecanismo de reflexión.
    Como se muestra en la figura anterior, el nombre y la edad de las variables miembro se encapsulan en objetos Field; el método de construcción se encapsula en objetos Constructor; los métodos miembro están encapsulados en objetos de método, este es el mecanismo de reflexión

    • beneficio:

      1. Estos objetos se pueden manipular durante la ejecución del programa, como se muestra a continuación:

        Muchos métodos disponibles saltan detrás de String str, esta es la imagen de arriba
        Inserte la descripción de la imagen aquí

      2. Se puede desacoplar para mejorar la escalabilidad del programa.

  • Cómo obtener el objeto Class

    1. Class.forName ("nombre de clase completo") ;: Carga el archivo de código de bytes en la memoria

      El nombre completo de la clase, es decir, el nombre del paquete debe incluirse al escribir el nombre de la clase.

      • Se utiliza principalmente para archivos de configuración, el último caso es un ejemplo
    2. Nombre de clase Clase: Obtenido por la clase de atributo del nombre de clase

      Usado en la etapa de objeto de clase

      • Se utiliza principalmente para la transferencia de parámetros
    3. Object.getClass (): el método getClass () se define en la clase Object

      • Se utiliza principalmente para obtener códigos de bytes para objetos.
  • Conclusión: El mismo archivo de código de bytes (* .class) solo se cargará una vez durante la ejecución de un programa, y ​​el objeto Class obtenido por cualquier método es el mismo
  • Función de objeto de clase:

    • Obtener función:
      1. Obtener variables de miembros
        • Field [] getFields (): Obtiene todas las variables miembro públicas modificadas

        • Field getField (String name): Obtiene la variable miembro pública modificada del nombre especificado

        • Campo [] getDeclaredFields ()

        • Campo getDeclaredField (nombre de cadena)

      2. Consigue los constructores
        • Constructor <?> [] GetConstructors ();
        • Constructor getConstructor (类 <?>… ParameterTypes)
        • Constructor <?> [] GetDeclaredConstructors ();
        • Constructor getDeclaredConstructor (类 <?>… ParameterTypes)
      3. Obtener métodos de miembros
        • Método [] getMethods ()
        • Método getMethod (nombre de cadena, 类 <?>… ParameterTypes)
        • Método [] getDeclaredMethods ()
        • Método getDeclaredMethod (nombre de cadena, 类 <?>… ParameterTypes)
      4. Obtener el nombre de la clase
        • String getName ()
  • Campo: variable miembro

    • operando

      1. Ajustes

        • obtener (Objeto obj)
      2. Obtener valor

        • set (Objeto obj)
      3. Ignorar las comprobaciones de modificadores de acceso

        • setAccessible (verdadero)
  • Constructor: Constructor

    • Crea un objeto:

      • T newInstance (Objeto ... initargs)

      • Si usa el constructor de parámetros vacío para crear el objeto, la operación se puede simplificar: el método newInstance del objeto Class

  • Método: objeto de método

    • Método de implementación:

      • Invocación de objeto (Object obj, Object ... args)
    • Obtener el nombre del método

      • String getName ();
  • Caso:

    • Requisitos: escribir un "marco" que nos pueda ayudar a crear objetos de cualquier clase y ejecutar cualquier método sin cambiar ningún código

      • lograr:

        1. Archivo de configuración
        2. reflexión
      • paso

        1. Defina el nombre de clase completo del objeto que se creará y el método que se ejecutará en el archivo de configuración.
        2. Cargue el archivo de configuración en el programa
        3. Utilice tecnología de reflexión para cargar archivos en la memoria
        4. Crea un objeto
        5. Método de ejecución
        package top.faroz.reflect;
        
        import top.faroz.domain.Person;
        import top.faroz.domain.Student;
        
        import java.io.IOException;
        import java.io.InputStream;
        import java.lang.reflect.Method;
        import java.util.Properties;
        
        /**
         * @ClassName ReflectTest
         * @Description 反射的实操
         * @Author FARO_Z
         * @Date 2020/8/15 12:45 上午
         * @Version 1.0
         **/
        public class ReflectTest {
                  
                  
            public static void main(String[] args) throws Exception {
                  
                  
                /**
                 * 可以创建任意类的对象,可以执行任意方法
                 * 前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
                 * 比如说下面这段代码
                 */
        //        Person person = new Person();
        //        person.eat();
        //
        //        Student student = new Student();
        //        student.sleep();
                /**
                 * 对不同的对象进行新建、调用方法,每次都要写新的代码,不符合上述的要求
                 * 但是,反射可以解决以上问题
                 */
        
                //1.加载配置文件
                    //1.1创建Properties对象
                Properties pro = new Properties();
                    //1.2加载配置文件,转换为一个集合
                        //1.2.1获取class目录下的文件位置
                ClassLoader classLoader = ReflectTest.class.getClassLoader();
                InputStream is = classLoader.getResourceAsStream("pro.properties");
                pro.load(is);
        
                //2.获取配置文件中定义的数据
                String ClassName=pro.getProperty("ClassName");
                String MethodName = pro.getProperty("MethodName");
        
                //3.加载该类进内存
                Class cls = Class.forName(ClassName);
                //4.创建对象
                Object obj = cls.newInstance();
                //5.获取方法对象
                Method method = cls.getMethod(MethodName);
                //6.执行方法
                method.invoke(obj);
            }
        }
        
        

Supongo que te gusta

Origin blog.csdn.net/weixin_44062380/article/details/108016935
Recomendado
Clasificación