【发布时间】:2019-10-26 16:41:54
【问题描述】:
我有一个带有私有方法的类,现在我想在类外访问该私有方法,这可以使用 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 ");
}
}
}
【问题讨论】:
-
你试过了吗?为什么不实现它并运行它,看看它是如何进行的?这将帮助您更好地理解,而且您永远不会忘记它:)
-
@MathewsMathai 我试过了!我已经使用工厂方法提供了该类的实例,你可以在这一行看到它 //PrivateMethodClass p = PrivateMethodClass.getInstance();
-
但这并不能进一步发挥作用。可能对我的问题的回答是,如果在单例类中包含类,则不可能在外部调用私有方法
-
通过
Class#getDeclaredConstructor获取构造函数,使构造函数可访问并通过Constructor#newInstance创建实例 -
类
PrivateMethodClass中的静态方法getInstance()是公共方法吗?
标签: java class private-methods private-constructor