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.
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:
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.
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());// 获取成员变量类型
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成员变量的值
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成员变量的值
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成员变量的值
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的值
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: