如何从java类外部调用私有方法
Posted
技术标签:
【中文标题】如何从java类外部调用私有方法【英文标题】:How to call a private method from outside a java class 【发布时间】:2012-07-02 04:39:19 【问题描述】:我有一个Dummy
类,它有一个名为sayHello
的私有方法。我想从外面的Dummy
打电话给sayHello
。我认为反射应该是可能的,但我得到了IllegalAccessException
。有什么想法???
【问题讨论】:
私有的想法不是不能从外面调用吗? 是的,反射是可能的,但是私有的目的是使从外部调用方法变得更加困难。也许它不应该是私有的? @robert 它在同一个程序(模块)中 @HamedRajabi:您的意思是调用私有方法的类和您的Dummy
类在同一个包中?如果是这种情况,您可能需要使用 package-private
(省略修饰符)。
@PriestVallon 是的,我知道我不应该在真正的程序中这样做,我只是想知道!!!
【参考方案1】:
在使用 invoke
方法之前,在 Method 对象上使用 setAccessible(true)
。
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
【讨论】:
因为getMethod
只返回public方法,所以需要getDeclaredMethod
如果方法有参数,请参见下面 Keyur 的回答。【参考方案2】:
首先,您必须获取类,这非常简单,然后使用 getDeclaredMethod
按名称获取方法,然后您需要将方法设置为可通过 setAccessible
对象上的 setAccessible
方法访问。
Class<?> clazz = Class.forName("test.Dummy");
Method m = clazz.getDeclaredMethod("sayHello");
m.setAccessible(true);
m.invoke(new Dummy());
【讨论】:
【参考方案3】:method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(object);
【讨论】:
【参考方案4】:如果您想将任何参数传递给私有函数,您可以将其作为调用函数的第二个、第三个......参数传递。以下是示例代码。
Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);
meth.setAccessible(true);
String name = (String) meth.invoke(obj, "Green Goblin");
完整的例子你可以看Here
【讨论】:
【参考方案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);
【讨论】:
以上是关于如何从java类外部调用私有方法的主要内容,如果未能解决你的问题,请参考以下文章