我有一个带有私有方法的类,现在我想访问该类之外的私有方法,这可以使用java中的反射包实现。但是,如果我们将类构造函数设为私有,那么如何访问该方法呢。在下面的代码中,考虑PrivateMethodClass具有私有方法m1和私有构造函数。
package allprograms;
import java.lang.reflect.*;
public class RecursionDemo {
public static void main(String[] args) {
try
{
PrivateMethodClass p = PrivateMethodClass.getInstance();
//Class c = Class.forName("allprograms.PrivateMethodClass"); //1
Class c = Class.class.asSubclass(p.getClass());
//Object o = c.newInstance(); //2
Method m = c.getDeclaredMethod("m1", null); //3
m.setAccessible(true);
m.invoke(p, null); //4
} /*
* catch(ClassNotFoundException e) { //for 1
* System.out.println("ClassNotFound"); }
*/catch (IllegalAccessException/* | InstantiationException */e) { // for 2
System.out.println("Illigal Access Exception or Instantiation Exception");
} catch(NoSuchMethodException e) { //for 3
System.out.println("No such Method Exception e");
} catch(Exception e) { //for 4
System.out.println("Invocation Target Exception ");
}
}
}
我不明白你的问题是什么。类PrivateMethodClass
中的静态方法getInstance()
是公共的,所以调用它没有问题,这意味着PrivateMethodClass
的构造函数是否为private无关紧要。
另一方面,如果您正在询问如何使用方法getInstance()
在没有的情况下实例化类PrivateMethodClass
,这也不是问题。正如您使用getDeclaredMethod()
来调用(private(方法m1()
一样,您也可以调用方法getDeclaredConstructor((来获得对private构造函数的引用。示例代码如下:
Class<?> c = PrivateMethodClass.class;
try {
Constructor<?> ctor = c.getDeclaredConstructor();
ctor.setAccessible(true);
Object obj = ctor.newInstance();
System.out.println(obj);
if (obj instanceof PrivateMethodClass) {
PrivateMethodClass p = (PrivateMethodClass) obj;
Method m = c.getDeclaredMethod("m1");
m.setAccessible(true);
m.invoke(p);
}
}
catch (Exception x) {
x.printStackTrace();
}
我是不是错过了什么?