[Java SE] Reflexión

Aprendí
reflexión hace mucho tiempo, tengo un poco de conocimiento de reflexión, hoy lo he resuelto en detalle.

1. Cómo obtener el objeto de clase

  • Class.forName ("nombre de clase completo"): carga el archivo de código de bytes en la memoria y devuelve el objeto de clase

    Se usa principalmente en archivos de configuración, define el nombre de la clase en el archivo de configuración, lee el archivo y carga la clase

  • Class name.class: Obtenido por la clase de atributo del nombre de la clase

    Se utiliza principalmente para la transferencia de parámetros

  • Object.getclass (): el método getclass () se define en la clase de objeto

    La forma de obtener el código de bytes que se usa principalmente para los objetos

  • Conclusión: El mismo archivo de código de bytes (* .class) solo se cargará una vez durante la ejecución de un programa. El objeto Class obtenido por cualquier método es el mismo

Inserte la descripción de la imagen aquí

2. Función del objeto de clase

2.1 Obtener función

  1. Obtener variables miembro

    • Field [] getFields (): obtiene todas las variables públicas
    • Field getField (nombre de cadena): Obtiene la variable pública del nombre especificado
    • Field [] getDeclaredFields (): Obtiene todas las variables miembro
    • Field getDeclaredField (nombre de cadena): Obtiene la variable con el nombre especificado
		Class testClass = Test.class; // 获取类对象
		Field field = testClass.getDeclaredField("name"); // 获取变量
		field.setAccessible(true); // 解除私有
		Test test = new Test();
		Object string = field.get(test); // 获取私有的值
		System.out.println("我是原来的:" + string);
		field.set(test, "lr"); // 修改私有的值
		Object string1 = field.get(test);
		System.out.println("我是后来的:" + string1);
  1. Obtener método de construcción

    • constructor <?> getconstructors ()
    • Constructorgetconstructor (类 <?>… ParameterTypes)
    • Constructor getDeclaredConstructor (类 <?>… ParameterTypes)
    • constructor <?> getDeclaredconstructors ()
		Class testClass = Test.class; // 获取类对象
		Constructor constructor = testClass.getConstructor(String.class); // 获取构造方法
		Object test = constructor.newInstance("张三"); // 实例化赋予初值
		System.out.println(test);
  1. Obtener método de miembro

    • Método [] getMethods ()
    • Método getHethod (nombre de cadena , 类 <?>… ParameterTypes)
    • Método [l getDeclaredMethods ()
    • Método getDeclaredMethod (nombre de cadena , 类 <?>… ParameterTypes)
		Class testClass = Test.class; // 获取类对象
		Test test = new Test(); 
		Method method = testClass.getMethod("test", int.class); // 放入实例化和参数
		method.invoke(test, 1); // 运行该方法
  1. Obtener el nombre de la clase

    • String.getName ()
  2. Campo: variable miembro

    • Establecer valor
      establecido ()
    • Obtener valor
      get ()
    • Ignore el modificador de permisos de acceso
      setAccessible (verdadero)
  3. Constructor: método de construcción

    • Crear objeto
      • newInstance (Objeto ... initargs)
  4. Método: objeto de método

    • Método de ejecución
      • Invocación de objeto (Object obj, Object ... args)
    • Obtener el nombre del método
      • String getName: obtiene el nombre del método

3. Caso

  • Requisitos: escribir un marco que pueda ayudarnos a crear objetos de cualquier clase y ejecutar cualquiera de sus métodos sin cambiar ningún código de la clase
  • 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. Cargar y leer archivos de configuración en el programa
    3. Utilice tecnología de reflexión para cargar archivos de clase en la memoria
    4. Método de creación
    5. Método de ejecución

Reflexionar Clase

package fanshe;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class Reflect {
    
    
	public static void main(String[] args) throws Exception {
    
    
		// 创建对象
		Properties properties = new Properties();
		// 获取类的加载器,可以找到src下的文件
		ClassLoader classLoader = Reflect.class.getClassLoader();
		// 读入文件
		InputStream stream = classLoader.getResourceAsStream("pro.properties");
		// 传入字节流
		properties.load(stream);

		// 获取配置文件中数据
		String className = properties.getProperty("className");
		String methodName = properties.getProperty("methodName");

		// 加载该类进内存
		Class cls = Class.forName(className);
		// 创建对象、实例化
		Object obj = cls.newInstance();

		Method method = cls.getDeclaredMethod(methodName);
		method.invoke(obj);

	}
}

propiedades pro.

className=fanshe.Person
methodName=sleep

Supongo que te gusta

Origin blog.csdn.net/qq_40915439/article/details/108741628
Recomendado
Clasificación