30

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???

Pshemo
  • 122,468
  • 25
  • 185
  • 269
Hamed Rajabi Varamini
  • 3,439
  • 3
  • 24
  • 38

5 Answers5

64

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
    }
}

If someone is interested in invoking methods with parameters see How do I invoke a Java method when given the method name as a string?, specifically answer like https://stackoverflow.com/a/30671481.

Just don't forget to add setAccessible(true) while invoking private methods.

Pshemo
  • 122,468
  • 25
  • 185
  • 269
  • 4
    because `getMethod` only returns public method, you need `getDeclaredMethod` – Pshemo Jul 01 '12 at 13:23
  • 1
    see Keyur's answer below if the method has arguments. – user1521213 Dec 12 '19 at 18:20
  • You should give examples with arguments. – vizzer Jun 19 '23 at 13:56
  • @vizzer Main problem/topic in this question is `IllegalAccessException` which means OP and reader most likely already know *general* way to use reflection to call method but are facing problem specifically with `private` methods. We already have many questions and answers about invoking methods with parameters via reflection like https://stackoverflow.com/a/30671481 so I don't feed the need to repeat it here, especially since that topic is broad and may require info about problems like handling primitive type arguments, difference between getDeclaredMethod vs getMethod, etc. – Pshemo Jun 19 '23 at 14:36
  • 1
    @vizzer Anyway I linked question with that subject at the bottom of my answer. Hope that is OK with you. – Pshemo Jun 19 '23 at 14:50
10

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,456
  • 2
  • 15
  • 23
9
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
Usman
  • 2,325
  • 1
  • 23
  • 18
8

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
  • 399
  • 3
  • 10
7

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
  • 7,515
  • 3
  • 24
  • 21