Reflexión inicial

Resumen de reflexión

Lenguaje estático vs dinámico

Lenguaje dinámico

  • Es un tipo de lenguaje cuya estructura se puede cambiar en tiempo de ejecución: por ejemplo, se pueden introducir nuevas funciones, objetos e incluso códigos, se pueden eliminar funciones existentes u otros cambios estructurales. En términos sencillos, el código puede cambiar su estructura de acuerdo con ciertas condiciones en tiempo de ejecución.
  • Principales lenguajes dinámicos: Object-c # JavaScript PHP Python, etc.

Lenguaje estático

  • En correspondencia con los lenguajes dinámicos, los lenguajes con estructuras de tiempo de ejecución inmutables son lenguajes estáticos, como Java C C ++
  • Java no es un lenguaje dinámico. DanJava se puede llamar un "lenguaje cuasi-dinámico". Es decir, Java tiene un cierto grado de dinámica, podemos utilizar el mecanismo de reflexión para obtener características similares a los lenguajes dinámicos ¡La dinámica de Java hace que la programación sea más flexible!

Reflexión de Java

  • Reflection es la clave para que Java sea considerado como un lenguaje dinámico.El mecanismo de reflexión permite a los programas obtener información interna de cualquier clase con la ayuda de Reflection API durante la ejecución, y puede manipular directamente las propiedades y métodos internos de cualquier objeto.

    Class c=class.forName("java.lang.String")
    
  • Después de que se carga la clase, se genera un objeto de tipo clase en el área de método de la memoria del montón (una clase tiene solo un objeto de clase), y este objeto contiene la información de estructura completa de la clase. Podemos ver la estructura de la clase a través de un objeto de estilo. Este objeto es como un espejo, y la estructura de la clase se puede ver a través de este espejo, por eso lo llamamos vívidamente: reflejo.

    正常方式: 引入需要的"包类"名称--->通过new实例化--->取得实例化对象
    反射方式: 实例化对象--->getCLass()方法--->得到完整的"包类"名称
    

Funciones proporcionadas por el cuerpo del mecanismo de reflexión de Java

  • Juzga la clase de cualquier objeto en tiempo de ejecución
  • Construye un objeto de cualquier clase en tiempo de ejecución
  • Juzgue las variables miembro y los métodos de cualquier clase en tiempo de ejecución
  • Obtenga información genérica en tiempo de ejecución
  • Llamar a variables miembro y métodos de cualquier objeto en tiempo de ejecución
  • Procesando anotaciones en tiempo de ejecución
  • Generar proxy dinámico

Ventajas y desventajas de la reflexión de Java

ventaja:

  • Puede realizar la creación dinámica de objetos y la compilación, mostrando una gran flexibilidad.

Desventajas:

  • Tiene un impacto en el rendimiento. El uso de la reflexión es básicamente una operación de interpretación, podemos decirle a la JVM lo que queremos hacer y cumplir con nuestros requisitos, este tipo de operación es siempre más lenta que realizar directamente la misma operación.
//什么是反射
public class Test01 {
    
    
    public static void main(String[] args) throws ClassNotFoundException {
    
    
        Class c1= Class.forName("Reflection.User");
        System.out.println(c1);

        Class c2= Class.forName("Reflection.User");
        Class c3= Class.forName("Reflection.User");
        Class c4= Class.forName("Reflection.User");

        //一个类在内存中只有一个Class对象
        //一个类被加载后,类的整个结构都会被封装在Class对象中  
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }

}

//实体类

class User{
    
    
    private int id;
    private String name;
    private int age;

    public int getId() {
    
    
        return id;
    }

    public String getName() {
    
    
        return name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public User(int id, String name, int age) {
    
    
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public User() {
    
    
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45162683/article/details/112093797
Recomendado
Clasificación