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