【问题标题】:How to call a private method from outside a java class如何从java类外部调用私有方法
【发布时间】:2012-07-02 04:39:19
【问题描述】:

我有一个Dummy 类,它有一个名为sayHello 的私有方法。我想从外面的Dummy 打电话给sayHello。我认为反射应该是可能的,但我得到了IllegalAccessException。有什么想法???

【问题讨论】:

  • 私有的想法不是不能从外面调用吗?
  • 是的,反射是可能的,但是私有的目的是使从外部调用方法变得更加困难。也许它不应该是私有的
  • @robert 它在同一个程序(模块)中
  • @HamedRajabi:您的意思是调用私有方法的类和您的Dummy 类在同一个包中?如果是这种情况,您可能需要使用 package-private(省略修饰符)。
  • @PriestVallon 是的,我知道我不应该在真正的程序中这样做,我只是想知道!!!

标签: java reflection call private


【解决方案1】:

在使用 invoke 方法之前,在 Method 对象上使用 setAccessible(true)

import java.lang.reflect.*;
class Dummy{
    private void foo(){
        System.out.println("hello foo()");
    }
}

class Test{
    public static void main(String[] args) throws Exception {
        Dummy d = new Dummy();
        Method m = Dummy.class.getDeclaredMethod("foo");
        //m.invoke(d);// throws java.lang.IllegalAccessException
        m.setAccessible(true);// Abracadabra 
        m.invoke(d);// now its OK
    }
}

【讨论】:

  • 因为getMethod只返回public方法,所以需要getDeclaredMethod
  • 如果方法有参数,请参见下面 Keyur 的回答。
【解决方案2】:

首先,您必须获取类,这非常简单,然后使用 getDeclaredMethod 按名称获取方法,然后您需要将方法设置为可通过 setAccessible 对象上的 setAccessible 方法访问。

    Class<?> clazz = Class.forName("test.Dummy");

    Method m = clazz.getDeclaredMethod("sayHello");

    m.setAccessible(true);

    m.invoke(new Dummy());

【讨论】:

    【解决方案3】:
    method = object.getClass().getDeclaredMethod(methodName);
    method.setAccessible(true);
    method.invoke(object);
    

    【讨论】:

      【解决方案4】:

      如果您想将任何参数传递给私有函数,您可以将其作为调用函数的第二个、第三个......参数传递。以下是示例代码。

      Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
      meth.setAccessible(true);
      String name = (String) meth.invoke(obj, "Green Goblin");
      

      完整的例子你可以看Here

      【讨论】:

        【解决方案5】:

        使用java反射访问私有方法(带参数)的示例如下:

        import java.lang.reflect.Field;
        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        class Test
        {
            private void call(int n)  //private method
            {
                System.out.println("in call()  n: "+ n);
            }
        }
        public class Sample
        {
            public static void main(String args[]) throws ClassNotFoundException,   NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
            {
                Class c=Class.forName("Test");  //specify class name in quotes
                Object obj=c.newInstance();
        
                //----Accessing private Method
                Method m=c.getDeclaredMethod("call",new Class[]{int.class}); //getting method with parameters
                m.setAccessible(true);
                m.invoke(obj,7);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 2014-08-06
          • 1970-01-01
          • 1970-01-01
          • 2014-08-31
          • 1970-01-01
          相关资源
          最近更新 更多