【问题标题】:Private method invoking from outside the class in Java从Java中的类外部调用的私有方法
【发布时间】: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


【解决方案1】:

我不明白你的问题是什么。 PrivateMethodClass 类中的静态方法getInstance() 是公共的,因此调用它没有问题,这意味着PrivateMethodClass 的构造函数是否私有 无关紧要。

另一方面,如果您询问如何使用方法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();
}

我错过了什么吗?

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2011-02-19
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多