Acceso de reflexión de Java a métodos de miembros

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.
Inserte la descripción de la imagen aquí
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();
		}

	}
}

Inserte la descripción de la imagen aquí
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();
		}

	}
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

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