Acceso de reflexión de Java a variables miembro

reflexión

A través del mecanismo de reflexión de Java, se puede acceder en el programa a la descripción del objeto Java que se ha cargado en la JVM, y se puede realizar la función de acceder, detectar y modificar la información que describe el objeto Java en sí. A través de la reflexión, puede acceder a constructores, variables de miembros y métodos de miembros.

Acceso al constructor: Java reflexión-acceso al constructor
acceso al método miembro: Java reflexión-acceso al método miembro

Acceso a variables de miembros

Utilice el objeto Field para manipular las variables miembro correspondientes.
Inserte la descripción de la imagen aquí
Métodos comunes de la clase Field:

método Descripción
getName () Obtener el nombre de una variable miembro
getType () Obtenga el objeto de clase que representa el tipo de variable miembro
obtener (Objeto obj) Obtenga el valor de la variable miembro en el objeto especificado obj, el valor de retorno es el tipo de objeto
set (Object obj, Object value) Establecer el valor de la variable miembro en el objeto especificado obj en valor
getInt (Objeto obj) Obtiene el valor de una variable miembro de tipo int en el objeto especificado obj
setInt (Objeto obj, int i) Establezca el valor de la variable miembro de tipo int en el objeto especificado obj en i
getFloat ((Objeto obj)) Obtiene el valor de una variable miembro de tipo float en el objeto especificado obj
setFloat (Object obj, float f) Establezca el valor de la variable miembro de tipo float en el objeto especificado obj af
getBoolean (Objeto obj) Obtiene el valor de una variable miembro de tipo booleano en el objeto especificado obj
setBoolean (Objeto obj, booleano z) Establezca el valor de la variable miembro de tipo booleano en el objeto especificado obj a z
setAccessible (bandera booleana) Este método puede establecer si ignorar las restricciones de permisos y acceder directamente a las variables de miembros con permisos privados como privados
getModifiers () Obtenga un número entero que pueda analizar el modificador usado por la variable miembro

El valor de retorno del método getModifiers () es la información del modificador representada. En esta clase se proporciona una serie de métodos estáticos para el análisis. No solo puede verificar si el modificador especificado lo modifica, sino también obtenerlos todos en forma de cadena Modificador.

Métodos analíticos comunes en la clase Modifier:

Método estático Descripción
isPublic (int mod) Verifique si es modificado por el modificador público, si es verdadero, de lo contrario devuelve falso
isProtected (int mod) Verifique si es modificado por el modificador protegido, si es verdadero, de lo contrario devuelve falso
isPrivate (int mod) Verifique si es modificado por el modificador privado, si es verdadero, de lo contrario devuelve falso
isStatic (int mod) Compruebe si está modificado por el modificador estático, si es verdadero, de lo contrario, devuelve falso
isFinal (int mod) Verifique si es modificado por el modificador Final, si es verdadero, de lo contrario devuelve falso
toString (int mod) Devuelve todos los modificadores como una cadena

Obtenga y modifique el valor de una variable miembro:
Inserte la descripción de la imagen aquí
primero cree una clase de estudio, declare tres tipos diferentes de variables miembro con diferentes modificadores en esta clase y asígnelos.

public class Study {
    
    
	public int id = 1;
	public String name = "反射";
	private double price = 3.1315;

}

Luego refleja estas tres variables en otra clase Study2.

public class Study2 {
    
    

	public static void main(String[] args) {
    
    
		try {
    
    
			Class c = Class.forName("study.czm.Study");// 创建class对象
			Field fi[] = c.getDeclaredFields();// 获取所有成员变量
			for (Field f : fi) {
    
    
				System.out.print(Modifier.toString(f.getModifiers()) + " ");// 获取成员变量修饰符
				System.out.print(f.getType());// 获取成员变量类型
				System.out.println();
			}
		} catch (ClassNotFoundException e) {
    
    
			e.printStackTrace();
		}

	}
}

Se obtuvo con éxito el modificador y el tipo de la variable miembro.
Inserte la descripción de la imagen aquí
Nota: El tipo String ha obtenido el nombre completo, que necesita ser simplificado. Agregue un método getSimpleName () a la línea de código que obtiene el tipo de variable miembro.

System.out.print(f.getType().getSimpleName());// 获取成员变量类型

Inserte la descripción de la imagen aquí
Obtenga el valor del nombre de la variable miembro a través de la reflexión

//创建对象
			Constructor cs = c.getConstructor();
			Study s = (Study) cs.newInstance();//获取Study对象
			Field f1 = c.getDeclaredField("name");//指定获取name的成员变量属性
			System.out.println("name的值:" + f1.get(s));//获取name成员变量的值

Inserte la descripción de la imagen aquí
Modifique el valor en getDeclaredField () para obtener el valor de diferentes variables y obtener el valor de la identificación de la variable miembro:

//创建对象
			Constructor cs = c.getConstructor();
			Study s = (Study) cs.newInstance();//获取Study对象
			Field f1 = c.getDeclaredField("id");//指定获取id的成员变量属性
			System.out.println("id的值:" + f1.get(s));//获取id成员变量的值

Inserte la descripción de la imagen aquí
El modificador del tipo doble es privado, por lo que se requiere permiso

//创建对象
			Constructor cs = c.getConstructor();
			Study s = (Study) cs.newInstance();//获取Study对象
			Field f1 = c.getDeclaredField("price");//指定获取price的成员变量属性
			f1.setAccessible(true);//获取访问权限
			System.out.println("price的值:" + f1.get(s));//获取price成员变量的值

Inserte la descripción de la imagen aquí
Además de obtener, también podemos modificar estos valores, tomar id como ejemplo

//创建对象
			Constructor cs = c.getConstructor();
			Study s = (Study) cs.newInstance();//获取Study对象
			Field f1 = c.getDeclaredField("id");//指定获取id的成员变量属性
			System.out.println("id本来的的值:" + f1.get(s));//获取id成员变量的值
			f1.set(s, 100);//修改id的值
			System.out.println("id修改后的值:" + f1.get(s));//输出id的值

Inserte la descripción de la imagen aquí
Código completo de la categoría Study2:

public class Study2 {
    
    

	public static void main(String[] args) {
    
    
		try {
    
    
			Class c = Class.forName("study.czm.Study");// 创建class对象
			Field fi[] = c.getDeclaredFields();// 获取所有成员变量
			for (Field f : fi) {
    
    
				System.out.print(Modifier.toString(f.getModifiers()) + " ");// 获取成员变量修饰符
				System.out.print(f.getType().getSimpleName() + " ");// 获取成员变量类型
				System.out.print(f.getName());// 获取成员变量名称
				System.out.println();
			}

			// 创建对象
			Constructor cs1 = c.getConstructor();
			Study s = (Study) cs1.newInstance();// 获取Study对象
			Field f1 = c.getDeclaredField("id");// 指定获取id的成员变量属性
			System.out.println("id本来的的值:" + f1.get(s));// 获取id成员变量的值
			f1.set(s, 100);// 修改id的值
			System.out.println("id修改后的值:" + f1.get(s));// 输出id的值

			// 创建对象
			Constructor cs2 = c.getConstructor();
			s = (Study) cs2.newInstance();// 获取Study对象
			Field f2 = c.getDeclaredField("name");// 指定获取name的成员变量属性
			System.out.println("name的值:" + f2.get(s));// 获取name成员变量的值

			// 创建对象
			Constructor cs3 = c.getConstructor();
			s = (Study) cs3.newInstance();// 获取Study对象
			Field f3 = c.getDeclaredField("price");// 指定获取price的成员变量属性
			f3.setAccessible(true);// 获取访问权限
			System.out.println("price的值:" + f3.get(s));// 获取price成员变量的值

		} catch (ClassNotFoundException e) {
    
    
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
    
    
			e.printStackTrace();
		} catch (SecurityException e) {
    
    
			e.printStackTrace();
		} catch (InstantiationException e) {
    
    
			e.printStackTrace();
		} catch (IllegalAccessException e) {
    
    
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
    
    
			e.printStackTrace();
		} catch (InvocationTargetException e) {
    
    
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
    
    
			e.printStackTrace();
		}

	}
}

resultado de la operación:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/javanofa/article/details/104751955
Recomendado
Clasificación