Sto usando java. Lo so usando il modificatore di accesso privato che possiamo limitare. Ma usando l'API Reflection posso accedere alla variabile anche al di fuori della classe. Allora, qual è l'uso del modificatore privato qui?come limitare la variabile per non accedere al di fuori della classe in java?
risposta
Poiché la riflessione interrompe l'incapsulamento. È possibile impedire l'uso dell'API di riflessione se l'applicazione è in esecuzione in un ambiente di sicurezza gestito. Vedi Java Security Manager
private
impedisce l'accesso da altre classi tramite Java. Tuttavia, usando JNI o una libreria puoi fare le cose in modo diverso. È possibile impedire la riflessione con un responsabile della sicurezza, ma raramente è necessario.
Nota: alcune librerie come la serializzazione devono essere in grado di accedere ai campi privati per funzionare.
+1. Per l'OP, si prega di notare che prevenire la riflessione interromperà l'interoperabilità con molte librerie Java che si potrebbe desiderare di utilizzare. – Perception
@Perception e alcune delle cose che le librerie fanno con la riflessione (creare costruttori senza argomenti che non esistono, quindi rottura finale, ecc.) Sono cambiamenti potenzialmente estremi nel codice. Molte volte chiudo gli occhi e prego che stiano facendo le cose per bene. :-) – user949300
@ user949300 - sicuramente. Però, puoi immaginare come sarebbe una libreria come Hibernate senza la capacità di riflettere e le classi di byte engineer? – Perception
allora che cosa è l'uso del modificatore privato qui
Il modificatore private
non è un meccanismo di sicurezza; è (una parte di) un meccanismo di incapsulamento. Nascondere gli interni di un oggetto dal consumo pubblico aiuta a mantenere gli oggetti in uno stato coerente e utilizzabile, fornendo al contempo commenti su quali parti di un oggetto compongono l'interfaccia pubblica (e può essere invocato per non cambiare).
Certo, gli utenti possono utilizzare la riflessione per accedere ai dati nei campi private
, ma sapranno che stanno facendo qualcosa che non è supportato dalla libreria.
Non sono esperto in materia di sicurezza Java, ma penso che sia necessario fornire il proprio SecurityManager e sovrascrivere checkMemberAccess(). ad esempio, per evitare ogni riflessione
public void checkMemberAccess(Class<?> clazz, int which) throws AccessControlException {
if (which != Member.PUBLIC) {
throw new AccessControlException("No reflection on non-public fields allowed");
}
}
Ovviamente, nel mondo reale, si potrebbe voler controllare solo per un certo sottoinsieme di classi "importanti" nel primo argomento. E, come notato in molte altre risposte, ciò causerà problemi a molte librerie di terze parti.
- 1. Variabile Javascript al di fuori della funzione?
- 2. Come far funzionare la traduzione al di fuori della classe?
- 3. Metodi definiti al di fuori della classe?
- 4. Come accedere al membro della classe genitore dalla classe nidificata in Java?
- 5. Come accedere al membro della classe per stringa in C#?
- 6. accedere a una variabile al di fuori della portata di una Handlebars.js ogni ciclo
- 7. Come posso creare un PHPDoc per le proprietà magiche al di fuori della definizione della classe?
- 8. come accedere alla variabile di classe per stringa in Python?
- 9. Accedere alla variabile membro pubblico della classe Java da Ant e utilizzarla in un'attività di compilazione
- 10. Definizioni di modelli al di fuori del corpo della classe
- 11. Definizione della funzione membro di classe esplicitamente specializzata al di fuori della definizione della classe
- 12. Come posso accedere al modulo di esecuzione o al nome della classe corrente in Python?
- 13. istruzioni condizionali in una classe, ma al di fuori del campo di applicazione della funzione
- 14. Dichiarare variabile fuori Ciclo Foreach in Java
- 15. Come può la variabile della classe di accesso al metodo statico in Python?
- 16. Java: Usando il metodo classe padre per accedere classe figlia variabile
- 17. Perché Java non mi consente di accedere al metodo privato tramite il metodo della stessa classe?
- 18. Costruttore/distruttore predefinito al di fuori della classe?
- 19. C'è un modo per chiamare una funzione di base al di fuori della classe in C++?
- 20. java debugging - guarda una variabile fuori ambito
- 21. Come accedere al servizio web usando una normale classe java?
- 22. Accesso costanti al di fuori di una classe
- 23. accesso alla variabile all'interno della classe interna in java
- 24. Esiste un modo per modificare il valore di un campo `private static final` in Java al di fuori della classe?
- 25. In Java, il nome della variabile può essere uguale al nome della classe
- 26. Java: estensione della classe al runtime
- 27. come accedere a una variabile di classe di classe esterna da classe interna in rubino
- 28. Come posso accedere all'oggetto di classe principale da una funzione all'interno della classe in Java?
- 29. Come aggiungere la variabile contatore al nome della variabile?
- 30. Come limitare la creazione di oggetti a non più di 3 nella classe Java?
Per impostazione predefinita è possibile accedere ai campi privati tramite riflessione? –
Sì. E non credo ci sia un modo semplice per dire a Java "nessuna riflessione sui miei campi privati". – user949300