In Java il private
modificatore di accesso è considerato sicuro poiché non è visibile all'esterno della classe. Allora anche il mondo esterno non conosce quel metodo.
Ma ho pensato che la riflessione Java possa essere utilizzata per infrangere questa regola. Considera il seguente caso:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Ora da un'altra classe riceverò informazioni:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
In questo momento ho pensato che il metodo privato fosse ancora sicuro poiché per fare qualcosa come sopra dobbiamo conoscere il nome del metodo. Ma se una classe che contiene un metodo privato scritto da qualcun altro non ne abbiamo visibilità.
Ma il mio punto diventa non valido poiché sotto la riga di codice.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Ora questo method[]
contiene tutte le cose che devi fare sopra. La mia domanda è: c'è un modo per evitare questo tipo di cose usando la riflessione Java?
Cito un punto della documentazione Java per chiarire la mia domanda.
Suggerimenti per la scelta di un livello di accesso:
Se altri programmatori usano la tua classe, vuoi assicurarti che non si verifichino errori da un uso improprio. I livelli di accesso possono aiutarti a farlo: utilizza il livello di accesso più restrittivo che abbia senso per un determinato membro. Usa privato a meno che tu non abbia una buona ragione per non farlo.
getDeclaredMethods
restituirebbe nomi che sembrano spazzatura.