web-dev-qa-db-fra.com

Comment appeler une méthode privée depuis l'extérieur d'une classe Java

J'ai une classe Dummy qui a une méthode privée appelée sayHello. Je veux appeler sayHello de l'extérieur Dummy. Je pense que cela devrait être possible avec la réflexion mais j'obtiens un IllegalAccessException. Des idées???

27
Hamed Rajabi

utilisez setAccessible(true) sur votre objet Method avant d'utiliser sa méthode 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
    }
}
57
Pshemo

Vous devez d'abord obtenir la classe, qui est assez simple, puis obtenir la méthode par son nom en utilisant getDeclaredMethod puis vous devez définir la méthode comme accessible par la méthode setAccessible sur la Method objet.

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

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

    m.setAccessible(true);

    m.invoke(new Dummy());
9
Mostafa Zeinali
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
8
Usman

Exemple d'accès à une méthode privée (avec paramètre) en utilisant Java réflexion comme suit:

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

Si vous voulez passer n'importe quel paramètre à une fonction privée, vous pouvez le passer comme deuxième, troisième ..... arguments de la fonction invoke. Voici un exemple de code.

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

Exemple complet que vous pouvez voir ici

5
Keyur