Закрытый метод, вызываемый извне класса в Java - PullRequest
0 голосов
/ 26 октября 2019

У меня есть один класс с приватным методом, теперь я хочу получить доступ к этому приватному методу вне класса, что возможно с помощью пакета отражения в 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 ");
        }
    }

}

1 Ответ

0 голосов
/ 26 октября 2019

Я не понимаю, в чем ваша проблема. Статический метод getInstance() в классе PrivateMethodClass является общедоступным, поэтому нет проблем с его вызовом. Это означает, что не имеет значения, является ли конструктор приватным или нет.

Если, с другой стороны, вы спрашиваете, как создать экземпляр класса PrivateMethodClass без с использованием метода getInstance(), это также не является проблемой. Так же, как вы используете 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();
}

Я что-то упустил?

...