我有一个Dummy
类,它有一个名为sayHello
的私有方法。我想从sayHello
外面拨打Dummy
。我认为应该可以通过反思来获得IllegalAccessException
。任何想法???
答案 0 :(得分:56)
在使用setAccessible(true)
方法之前,在Method对象上使用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
}
}
答案 1 :(得分:9)
首先你必须得到类,这很简单,然后使用getDeclaredMethod
按名称获取方法,然后你需要在setAccessible
上通过Method
方法设置方法对象。
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
答案 2 :(得分:8)
method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
答案 3 :(得分:5)
如果要将任何参数传递给私有函数,可以将其作为调用函数的第二个,第三个.....参数传递。以下是示例代码。
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
您可以看到Here
的完整示例答案 4 :(得分:5)
使用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);
}
}