Comment appeler une méthode privée à l'extérieur d'une classe java

j'ai un Dummy classe a une méthode privée appelée sayHello. Je veux l'appeler sayHello à partir de l'extérieur Dummy. Je pense qu'il devrait être possible avec la réflexion, mais je reçois un IllegalAccessException. Des idées???

27
demandé sur Hamed Rajabi 2012-07-01 17:14:14

5 réponses

utiliser setAccessible(true) sur votre objet Method avant d'utiliser son invoke méthode.

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
répondu Pshemo 2016-07-01 12:17:03

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

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

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

    m.setAccessible(true);

    m.invoke(new Dummy());
9
répondu Mostafa Zeinali 2012-07-01 13:17:43
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
8
répondu Usman 2012-07-01 13:19:53

Si vous souhaitez passer un paramètre à la fonction privée, vous pouvez le passer en 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 vous pouvez le voir Ici

5
répondu Keyur 2014-01-23 14:00:09

Exemple d'accès à la méthode privée(avec paramètre) à l'aide de 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
répondu kalyani chaudhari 2016-06-09 13:14:07