Jak wywołać metodę prywatną spoza klasy java

Mam klasę Dummy, która ma prywatną metodę o nazwie sayHello. Chcę zadzwonić {[1] } z zewnątrz Dummy. Myślę, że powinno być to możliwe z refleksją, ale dostaję IllegalAccessException. Jakieś pomysły???

Author: Hamed Rajabi, 2012-07-01

5 answers

Użyj setAccessible(true) na obiekcie metody przed użyciem jej metody invoke.

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
    }
}
 54
Author: Pshemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 12:17:03

Najpierw musisz pobrać klasę, która jest dość prosta, następnie pobrać metodę po nazwie używając getDeclaredMethod następnie musisz ustawić metodę jako dostępną metodą setAccessible na obiekcie Method.

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

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

    m.setAccessible(true);

    m.invoke(new Dummy());
 9
Author: Mostafa Zeinali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-01 13:17:43
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
 8
Author: Usman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-01 13:19:53

Jeśli chcesz przekazać dowolny parametr do funkcji prywatnej, możesz przekazać go jako drugi, trzeci..... argumenty wywołania funkcji. Poniżej znajduje się przykładowy kod.

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

Pełny przykład można zobaczyć tutaj

 5
Author: Keyur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 14:00:09

Przykład dostępu do prywatnej metody (z parametrem) przy użyciu java reflection w następujący sposób:

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);
    }
}
 5
Author: kalyani chaudhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 13:14:07