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???
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
}
}
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());
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
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);
}
}
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