如何在反射 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 对象表示的底层方法。
- 示例 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); } } } }
输出:
下面的程序演示了在Java中调用私有方法:
- 示例 1:当私有函数的名称已知时。