Al realizar el método de Java reflexión

Para obtener información sobre un método de objeto dinámico, primero tiene que crear un tipo de método de objeto o matriz por uno de los métodos siguientes.

	getMethods()
	
	getMethods(String name,Class<?> …parameterTypes)
	
	getDeclaredMethods()
	
	getDeclaredMethods(String name,Class<?>...parameterTypes)

El método de acceso a la configuración especificada, es necesario acceder a los parámetros de acuerdo con el tipo del proceso de entrada . Por ejemplo, el acceso a un nombre max, de entrada y parámetros de tipo String eran tipos int.

A continuación se puede lograr de dos maneras:

objectClass.getDeclaredConstructor("max",int.class,String.class);

objectClass.getDeclaredConstructor("max",new Class[]{int.class,String.class});

método común clase Método

Nombre del método estático explicación
getName () Obtiene el nombre del método
getParameterType () Devuelve los diversos parámetros del método en orden de la declaración en la forma de una clase de tipo de matriz
GetReturnType () Tipo de retorno del método se obtiene en forma de objetos Class
getExceptionTypes () Este tipo de método para obtener una excepción podría ser lanzado en forma de una matriz de Clase
invoke (Object obj, objeto ... args) Realización de la obj objeto especificado en el método que utiliza el parámetro args, el valor de retorno de tipo Object
isVarArgs () Para ver si el método permite un número variable de parámetros, si se permite que devolver verdadero, falso en caso contrario
getModifiers () Puede ser obtenido mediante el análisis del método utiliza el modificador de número entero

Método método ilustrativo de cómo llamar a la información de clase adquiridos en el método de la clase dinámica.

1. En primer lugar crear una clase de libro, y escribir cuatro métodos tienen diferentes alcances. Libro de la clase código final de la siguiente manera:

public class Book {
    // static 作用域方法
    static void staticMethod() {
        System.out.println("执行staticMethod()方法");
    }

    // public 作用域方法
    public int publicMethod(int i) {
        System.out.println("执行publicMethod()方法");
        return 100 + i;
    }

    // protected 作用域方法
    protected int protectedMethod(String s, int i) throws NumberFormatException {
        System.out.println("执行protectedMethod()方法");
        return Integer.valueOf(s) + i;
    }

    // private 作用域方法
    private String privateMethod(String... strings) {
        System.out.println("执行privateMethod()方法");

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < sb.length(); i++) {
            sb.append(strings[i]);
        }
        return sb.toString();
    }
}

2) preparación de prueba clase de prueba, la clase en el método main () para el acceso de toda clase libro métodos reflexión, y si el método con el parámetro tipo de variable, un tipo de entrada de parámetro de salida y el tipo de información que puede ser arrojado a consola.

código de clase de prueba de la siguiente manera:

public class Test {
    public static void main(String[] args) {
        // 获取动态类Book1
        Book book = new Book();
        Class class1 = book.getClass();
        // 获取Book1类的所有方法
        Method[] declaredMethods = class1.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            Method method = declaredMethods[i];
            System.out.println("方法名称为:" + method.getName());
            System.out.println("方法是否带有可变数量的参数:" + method.isVarArgs());
            System.out.println("方法的参数类型依次为:");
            // 获取所有参数类型
            Class[] methodType = method.getParameterTypes();
            for (int j = 0; j < methodType.length; j++) {
                System.out.println(" " + methodType[j]);
            }
            // 获取返回值类型
            System.out.println("方法的返回值类型为:" + method.getReturnType());
            System.out.println("方法可能抛出的异常类型有:");
            // 获取所有可能抛出的异常
            Class[] methodExceptions = method.getExceptionTypes();
            for (int j = 0; j < methodExceptions.length; j++) {
                System.out.println(" " + methodExceptions[j]);
            }
            boolean isTurn = true;
            while (isTurn) {
                try { // 如果该成员变量的访问权限为private,则抛出异常
                    isTurn = false;
                    if (method.getName().equals("staticMethod")) { // 调用没有参数的方法
                        method.invoke(book);
                    } else if (method.getName().equals("publicMethod")) { // 调用一个参数的方法
                        System.out.println("publicMethod(10)的返回值为:" + method.invoke(book, 10));
                    } else if (method.getName().equals("protectedMethod")) { // 调用两个参数的方法
                        System.out.println("protectedMethod(\"10\",15)的返回值为:" + method.invoke(book, "10", 15));
                    } else if (method.getName().equals("privateMethod")) { // 调用可变数量参数的方法
                        Object[] parameters = new Object[] { new String[] { "J", "A", "V", "A" } };
                        System.out.println("privateMethod()的返回值为:" + method.invoke(book, parameters));
                    }
                } catch (Exception e) {
                    System.out.println("在设置成员变量值时抛出异常,下面执行setAccessible()方法");
                    method.setAccessible(true); // 设置为允许访问private方法
                    isTurn = true;

                }
            }
            System.out.println("=============================\n");
        }
    }
}

3) ejecutar la prueba de clase de prueba, seguido de un programa dinámico tendrá acceso a todos los métodos de la clase libro. Método de acceso métodoestático efecto en funcionamiento () es como sigue:

方法名称为:staticMethod
方法是否带有可变数量的参数:false
方法的参数类型依次为:
方法的返回值类型为:void
方法可能抛出的异常类型有:
执行staticMethod()方法
=============================

Método de acceso efecto corriendo publicMethod () es como sigue:

方法名称为:publicMethod
方法是否带有可变数量的参数:false
方法的参数类型依次为:
int
方法的返回值类型为:int
方法可能抛出的异常类型有:
执行publicMethod()方法
publicMethod(10)的返回值为:110
=============================

Método de acceso efecto corriendo protectedMethod () es como sigue:

方法名称为:protectedMethod
方法是否带有可变数量的参数:false
方法的参数类型依次为:
class java.lang.String
int
方法的返回值类型为:int
方法可能抛出的异常类型有:
class java.lang.NumberFormatException
执行protectedMethod()方法
protectedMethod("10",15)的返回值为:25
=============================

Método de acceso efecto corriendo privateMethod () es como sigue:

方法名称为:privateMethod
方法是否带有可变数量的参数:true
方法的参数类型依次为:
class java.lang.String;
方法的返回值类型为:class java.lang.String
方法可能抛出的异常类型有:
在设置成员变量值时抛出异常,下面执行setAccessible()方法
执行privateMethod()方法
privateMethod()的返回值为:
=============================
发布了457 篇原创文章 · 获赞 94 · 访问量 1万+

Supongo que te gusta

Origin blog.csdn.net/weixin_45743799/article/details/104728415
Recomendado
Clasificación