如何使用反射从Java类外部调用私有方法而不会获得IllegalAccessException?

gblwokeq  于 2023-06-20  发布在  Java
关注(0)|答案(5)|浏览(122)

我有一个Dummy类,它有一个名为sayHello的私有方法。我想从Dummy外部呼叫sayHello。我认为这应该是可能的反射,但我得到一个IllegalAccessException。有什么想法吗??

snz8szmq

snz8szmq1#

在Method对象上使用setAccessible(true),然后再使用它的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
    }
}

如果有人对调用带参数的方法感兴趣,请参阅How do I invoke a Java method when given the method name as a string?,具体回答如下:https://stackoverflow.com/a/30671481
只是不要忘记在调用private方法时添加setAccessible(true)

oyt4ldly

oyt4ldly2#

首先,你需要得到类,这是非常直接的,然后使用getDeclaredMethod通过名称获得方法,然后你需要将方法设置为Method对象上的setAccessible方法可访问。

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

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

    m.setAccessible(true);

    m.invoke(new Dummy());
tag5nh1u

tag5nh1u3#

method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
kpbwa7wx

kpbwa7wx4#

如果你想把任何参数传递给私有函数,你可以把它作为第二个,第三个.....调用函数的参数。下面是示例代码。

Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");

完整的例子可以看到Here

bn31dyow

bn31dyow5#

使用java反射访问私有方法(带参数)的示例如下:

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

相关问题