¿Cómo llamar al método privado de otra clase en Java con la ayuda de Reflection API?

Podemos llamar al método privado de una clase desde otra clase en Java (que se definen usando el modificador de acceso privado en Java).

Podemos hacer esto cambiando el comportamiento de tiempo de ejecución de la clase usando algunos métodos predefinidos de Java. Para acceder a un método privado de clase diferente, usaremos la API de Reflection .

Para llamar al método privado, usaremos los siguientes métodos de Java.lang.class y Java.lang.reflect.Method

  • Method[] getDeclaredMethods() : este método devuelve un objeto Method que refleja el método declarado especificado de la clase o interfaz representada por este objeto Class.
  • setAccessible() : establece el indicador accesible para este objeto en el valor booleano indicado. Un valor de verdadero indica que el objeto reflejado debe suprimir la verificación de acceso al lenguaje Java cuando se usa. Un valor falso indica que el objeto reflejado debe aplicar comprobaciones de acceso al lenguaje Java.
  • invocar() : Invoca el método subyacente representado por este objeto Método, en el objeto especificado con los parámetros especificados.
    • Los siguientes programas demuestran la llamada del método privado en Java:

      • Ejemplo 1: Cuando ya se conoce el nombre de la función privada.

        // Java program to call
        // private method of a
        // class from another class
          
        import Java.lang.reflect.Method;
          
        // The class containing
        // a private method and
        // a public method
        class Check {
          
            // Private method
            private void private_Method()
            {
                System.out.println("Private Method "
                                   + "called from outside");
            }
          
            // Public method
            public void printData()
            {
                System.out.println("Public Method");
            }
        }
          
        // Driver code
        class GFG {
          
            public static void main(String[] args)
                throws Exception
            {
                Check c = new Check();
          
                // Using getDeclareMethod() method
                Method m = Check.class
                               .getDeclaredMethod("private_Method");
          
                // Using setAccessible() method
                m.setAccessible(true);
          
                // Using invoke() method
                m.invoke(c);
            }
        }
        Producción:
      • Ejemplo 2: cuando no se conoce el nombre de la función privada pero se conoce el nombre de la clase.

        // Java program to call private method
        // of a class from another class
          
        import Java.lang.reflect.Method;
          
        // The class contains a private method
        class Check {
          
            // Private method
            private void Demo_private_Method()
            {
                System.out.println("Private Method "
                                   + "called from outside");
            }
          
            // Public method
            public void printData()
            {
                System.out.println("Public Method");
            }
        }
          
        // Driver code
        class GFG {
          
            public static void main(String[] args)
                throws Exception
            {
                Check c = new Check();
                Method m;
          
                // Using getDeclareMethod() method
                Method method[]
                    = Check.class.getDeclaredMethods();
          
                for (int i = 0; i < method.length; i++) {
                    String meth
                        = new String(method[i].toString());
                    if (meth.startsWith("private")) {
          
                        String s = method[i].toString();
          
                        int a = s.indexOf(".");
                        int b = s.indexOf("(");
          
                        // Method name retrieved
                        String method_name = s.substring(a + 1, b);
          
                        // Print method name
                        System.out.println("Method Name = "
                                           + method_name);
          
                        // Using getDeclareMethod() method
                        m = Check.class.getDeclaredMethod(method_name);
          
                        // Using setAccessible() method
                        m.setAccessible(true);
          
                        // Using invoke() method
                        m.invoke(c);
                    }
                }
            }
        }
        Producción:

Publicación traducida automáticamente

Artículo escrito por Rajnis09 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *