I have a Dummy class that has a private method called sayHello. I want to call sayHello from outside Dummy. I think it should be possible with reflection but I get an IllegalAccessException. Any ideas???
Asked
Active
Viewed 6.8k times
30
Hamed Rajabi
- 3,353
- 3
- 22
- 37
-
14Isn't the idea of private that you can't call it from outside? – PriestVallon Jul 01 '12 at 13:16
-
Yes, it's possible with reflection, but the point of private is to make it harder to call methods from the outside. Maybe it _shouldn't be private_? – Louis Wasserman Jul 01 '12 at 13:18
-
@robert it's in the same program (module) – Hamed Rajabi Jul 01 '12 at 13:21
-
@HamedRajabi: you mean the class that call the private method and your `Dummy` class is in the same package? If that's the case, you may want to use `package-private` (omitting the modifier). – Genzer Jul 01 '12 at 13:29
-
1@PriestVallon Yes I know I'm not supposed to do this in a real program, I was just wondering!!! – Hamed Rajabi Jul 01 '12 at 13:30
5 Answers
63
use setAccessible(true) on your Method object before using its invoke method.
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
}
}
Pushpinder Singh Grewal
- 105
- 2
- 13
Pshemo
- 118,400
- 24
- 176
- 257
-
4because `getMethod` only returns public method, you need `getDeclaredMethod` – Pshemo Jul 01 '12 at 13:23
-
9
First you gotta get the class, which is pretty straight forward, then get the method by name using getDeclaredMethod then you need to set the method as accessible by setAccessible method on the Method object.
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
Mostafa Zeinali
- 2,196
- 2
- 14
- 20
8
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
Usman
- 2,307
- 1
- 22
- 18
7
If you want to pass any parameter to private function you can pass it as second, third..... arguments of invoke function. Following is sample code.
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
Full example you can see Here
Keyur
- 389
- 3
- 10
6
Example of accessing private method(with parameter) using java reflection as follows :
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);
}
}
kalyani chaudhari
- 6,807
- 3
- 23
- 21