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 a variables miembro: Java reflexión-acceso a variables miembro
Método de miembro de acceso
Utilice el objeto Método para manipular el método correspondiente.
Métodos comunes proporcionados por la clase Method
método | Descripción |
---|---|
getName () | Obtener el nombre del método |
getParameterTypes () | Obtenga el tipo de cada parámetro del método en forma de matriz de clase en el orden de declaración |
getReturnType () | Obtenga el tipo de valor de retorno del método en forma de objeto Class |
getExceptionTypes () | Obtenga el tipo de excepción que el método puede generar en forma de matriz de clase |
invocar (Object obj, Object ... args) | Use el parámetro especificado args para ejecutar el método en el objeto especificado obj, y el valor de retorno es Tipo de objeto |
isVarArgs () | Verifique si el constructor puede tener un número variable de parámetros, si puede devolver verdadero, no puede devolver falso |
getModifiers () | Obtenga un número entero que se pueda analizar a partir del modificador utilizado por el método |
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 |
Escriba un ejemplo para reflejar cuántos métodos hay en una clase, tome java.lang.String como ejemplo.
public class Study2 {
public static void main(String[] args) {
try {
Class c = Class.forName("java.lang.String");// 创建class对象
Method ms[] = c.getDeclaredMethods();// 获得所有的方法
for (Method m : ms) {
System.out.print(Modifier.toString(m.getModifiers()) + " ");// 获取所有方法的修饰符
System.out.print(m.getReturnType().getSimpleName() + " ");// 获取方法的返回值类型
System.out.print(m.getName() + "(");// 获取方法的名字
Class cla1[] = m.getParameterTypes();// 获取方法的参数类型
for (int i = 0; i < cla1.length; i++) {
System.out.print(cla1[i].getSimpleName() + " args ");
}
System.out.print(")");
Class cla2[] = m.getExceptionTypes();// 获取方法可能抛出的异常
for (int i = 0; i < cla2.length; i++) {
System.out.print(cla2[i].getSimpleName());
}
System.out.println(" { }");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Se generan los modificadores, nombres de métodos, tipos de valores de retorno, parámetros de métodos y excepciones que pueden generar los métodos.
Sabiendo cómo reflejar estos métodos, ¿cómo llamar a estos métodos? Cree un método de miembro simple en Study.
public class Study {
public void add(int a, int b) {
System.out.println("a+b="+(a+b));
}
}
Calcula el valor de a + b. Llamado en Study2, calculado.
public class Study2 {
public static void main(String[] args) {
try {
Class c = Class.forName("study.czm.Study");// 创建class对象
Method ms[] = c.getDeclaredMethods();// 获得所有的方法
for (Method m : ms) {
System.out.print(Modifier.toString(m.getModifiers()) + " ");// 获取所有方法的修饰符
System.out.print(m.getReturnType().getSimpleName() + " ");// 获取方法的返回值类型
System.out.print(m.getName() + "(");// 获取方法的名字
Class cla1[] = m.getParameterTypes();// 获取方法的参数类型
for (int i = 0; i < cla1.length; i++) {
System.out.print(cla1[i].getSimpleName() + " args ");
}
System.out.print(")");
Class cla2[] = m.getExceptionTypes();// 获取方法可能抛出的异常
for (int i = 0; i < cla2.length; i++) {
System.out.print(cla2[i].getSimpleName());
}
System.out.println(" { }");
}
Constructor cs = c.getConstructor();// 创建实例化对象
Object obj = cs.newInstance();// 无参构造方法创建对象
Method m = c.getDeclaredMethod("add", int.class, int.class);// 创建方法对象
m.invoke(obj, 1, 2);
} 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();
}
}
}