51-Entendiendo el mecanismo de reflexión

Mecanismo de reflexión cognitiva

  La razón por la que hay tanto soporte de tecnología de código abierto en el lenguaje Java, una gran parte proviene de la característica más importante de Java: el mecanismo de reflexión. Si no puede utilizar de forma flexible el mecanismo de reflexión para el desarrollo y diseño de proyectos ahora, se puede decir que no ha tocado la esencia de Java.
  Todas las tecnologías logran un solo objetivo:Reutilización

Introducción al mecanismo de reflexión

  La primera consideración para la tecnología de reflexión es el concepto de negativo y positivo . La llamada operación "positiva" significa que cuando queremos usar una clase, primero debemos importar el paquete donde se encuentra el programa, y ​​luego instanciar el objeto de acuerdo con la clase, y confiar en el objeto para llamar al método en la clase. Pero si dice "inverso", infiera su tipo basándose en el objeto instanciado.
Operación hacia adelante

import java.util.Date;		//导入程序所在的包,知道对象的出处

public class test {
    
    

	public static void main(String[] args) {
    
    
		Date date = new Date();		//通过类产生实例化对象
		System.out.println(date.getTime());		//使用方法
	}
}

  Para realizar la operación de procesamiento inverso, lo primero que se debe adoptar es un método de operación proporcionado en la clase Object:

  • Obtener información de la clase:public final Class<?> getClass();

Observe el uso de objetos de clase.

package java_study_aliyun.Basic;

import java.util.Date;		//导入程序所在的包,知道对象的出处

public class test {
    
    

	public static void main(String[] args) {
    
    
		Date date = new Date();		//通过类产生实例化对象
		System.out.println(date.getClass());		//通过实例化对象找到对象的所属类型
	}
}

  getClass () puede ayudar a los usuarios a encontrar la raíz del objeto.

Tres modos de instanciación de objetos de clase

  Todas las operaciones centrales en la reflexión se expanden a través de los objetos de la clase Class. Se puede decir que la clase Class es la fuente de las operaciones de reflexión, pero si esta clase quiere obtener sus objetos instanciados, se puede hacer de tres maneras. Observe java. La definición de la clase lang.Class: A public final class Class<T> extends Object implements Serializable,GenericDeclaration,Type,AnnotatedElement;
  partir de JDK1.5, la clase Class se puede marcar con genéricos cuando se define Este uso es principalmente para evitar la llamada transformación descendente. Explique tres formas de instanciación a través de operaciones específicas.

  1. [Soporte de clase de objeto] La clase de objeto puede obtener objetos de clase basados ​​en objetos instanciados:public final Class<?> getClass();
package java_study_aliyun.Basic;

import java.util.Date;		//导入程序所在的包,知道对象的出处

class Person{
    
    }

public class test {
    
    

	public static void main(String[] args) {
    
    
		Person per = new Person();
		Class<? extends Person> cls  = per.getClass();
		System.out.println(cls);
		System.out.println(cls.getName());		//获取类的完整名称
	}
}
  • Este método tiene una deficiencia que no es una deficiencia: si solo desea obtener un objeto de clase, debe generar un objeto de clase específico antes de poder obtenerlo.
  1. [Soporte directo de JVM] Adoptar "Class.class"Se crea una instancia directamente
package java_study_aliyun.Basic;

import java.util.Date;		//导入程序所在的包,知道对象的出处

class Person{
    
    }

public class test {
    
    

	public static void main(String[] args) {
    
    
		Class<? extends Person> cls  = Person.class;
		System.out.println(cls);
		System.out.println(cls.getName());		//获取类的完整名称
	}
}
  • Si desea utilizar este modo, debe importar el paquete de desarrollo correspondiente al programa.
  1. [Soporte de clase] Proporciona un método estático en la clase de clase:public static Class<?> forName(String className) throws ClassNotFoundException
package java_study_aliyun.Basic;

public class test {
    
    

	public static void main(String[] args) throws ClassNotFoundException {
    
    
		Class<?> cls = Class.forName("java.util.Date");
		System.out.println(cls);
		System.out.println(cls.getName());		//获取类的完整名称
	}
}
  • La característica más importante de este modo es que el tipo que se utilizará se define directamente en forma de cadena y no es necesario escribir declaraciones de importación en el programa.
  • Si la clase de programa que se utilizará no existe en este momento, se lanzará "java.lang.ClassNotFoundException"

Supongo que te gusta

Origin blog.csdn.net/MARVEL_3000/article/details/114441089
Recomendado
Clasificación