📜  如何在反射 API 的帮助下从Java中的另一个类调用私有方法?

📅  最后修改于: 2022-05-13 01:54:21.770000             🧑  作者: Mango

如何在反射 API 的帮助下从Java中的另一个类调用私有方法?

我们可以从Java中的另一个类(使用Java中的 private 访问修饰符定义)调用一个类的私有方法。

我们可以通过使用Java的一些预定义方法来改变类的运行时行为来做到这一点。为了访问不同类的私有方法,我们将使用反射 API。

要调用私有方法,我们将使用以下Java.lang.class 和Java.lang.reflect.Method 方法

  • Method[] getDeclaredMethods():该方法返回一个Method对象,该对象反映了该Class对象所代表的类或接口的指定声明方法。
  • setAccessible():将此对象的可访问标志设置为指示的布尔值。值为 true 表示反射对象在使用时应禁止Java语言访问检查。值 false 表示反射对象应该强制执行Java语言访问检查。
  • invoke():它使用指定的参数在指定的对象上调用此 Method 对象表示的底层方法。

      下面的程序演示了在Java中调用私有方法:

      • 示例 1:当私有函数的名称已知时。
        // 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);
            }
        }
        
        输出:
      • 示例 2:当私有函数的名称未知但类名已知时。
        // 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);
                    }
                }
            }
        }
        
        输出: