Invocare dall’esterno un metodo protetto o privato di una classe java: sicuri che sia impossibile ?

febbraio 7, 2007 by davide  
Filed under Java

La risposta più corretta è: “dipende dalla presenza o meno di un security manager”.

Infatti attraverso la reflection è effettivamente possibile andare a forzare i vincoli del linguaggio Java senza eccessiva difficoltà, ammenochè appunto non sia presente un security manager, unico attore in grado realmente di gestire ed eventualmente bloccare tali tipologie di forzature.

Ma veniamo subito all’esempio pratico che vale più di molte disquisizioni. Data la seguente classe:


package net.nothing2hide.test;

public class ClassWithMethodsToHack {

  private void sayHello(String name){
      System.out.println("Hello " + name +
          "! You're calling a private method");
  }
}

vogliamo dimostrare come sia facilmente invocabile dall’esterno il metodo privato “sayHello“; come già vi ho anticipato per farlo utilizzeremo pesantemente la reflection:


package net.nothing2hide.test;

public class PrivateMethodInvocationTest {

  /**
  * This sample class demonstrates how to
  * invoke a protected method on another class
  *
  * @param args
  */
  public static void main(String[] args) {
    String myName = "Davide";
    Method m;
    try {
      //Let'access the private method
      //by reflection. You could do the same
      //with a protected method
      m = ClassWithMethodsToHack.class.getDeclaredMethod(
      "sayHello", new Class[]{String.class});
      if (m != null) {
        //Let's force the java language access
        //checks on the reflected method. Note
        //that if a security manager is defined
        //this workaround could not be permitted
        //and a SecurityException could be raised
        m.setAccessible(true);

        //And finally let's invoke the protected method
        m.invoke(new ClassWithMethodsToHack(),
        new Object[]{myName});
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}