Estoy usando java. Sé usando privado modificador de acceso que podemos restringir. Pero al usar Reflection API todavía puedo acceder a la variable fuera de la clase. Entonces, ¿cuál es el uso del modificador privado aquí?cómo restringir la variable de no acceder fuera de la clase en java?
Respuesta
Porque la reflexión rompe la encapsulación. Puede evitar el uso de la API de reflexión si su aplicación se ejecuta en un entorno administrado de seguridad. Consulte Java Security Manager
private
le impide acceder desde otras clases que usan Java. Sin embargo, al usar JNI o una biblioteca puede hacer las cosas de manera diferente. Puede evitar la reflexión con un administrador de seguridad, pero esto rara vez es necesario.
Nota: algunas bibliotecas, como la Serialización, necesitan poder acceder a los campos privados para que funcionen.
+1. Para el OP, tenga en cuenta que evitar la reflexión romperá su interoperabilidad con muchas bibliotecas de Java que le gustaría usar. – Perception
@Perception y algunas de las cosas que las bibliotecas hacen con la reflexión (crear constructores no-arg que no existen, por lo tanto, romper final, etc.) son cambios potencialmente extremos en su código. Muchas veces solo cierro los ojos y oro para que hagan las cosas bien. :-) – user949300
@ user949300 - definitivamente. Sin embargo, ¿te imaginas cómo sería una biblioteca como Hibernate sin la capacidad de reflejar y diseñar las clases de byte? – Perception
entonces ¿cuál es el uso de modificador privada aquí
El modificador private
no es un mecanismo de seguridad; es (una parte de) un mecanismo de encapsulación. Ocultar las partes internas de un objeto del consumo público ayuda a mantener los objetos en un estado consistente y utilizable, al tiempo que proporciona comentarios sobre qué partes de un objeto componen la interfaz pública (y se puede confiar en que no se modifique).
Claro, los usuarios pueden usar la reflexión para acceder a los datos en los campos private
, pero sabrán que están haciendo algo que no es compatible con la biblioteca.
No soy experto en las cuestiones de seguridad de Java, pero creo que debe proporcionar su propio SecurityManager y anular el checkMemberAccess(). por ejemplo, para evitar toda reflexión
public void checkMemberAccess(Class<?> clazz, int which) throws AccessControlException {
if (which != Member.PUBLIC) {
throw new AccessControlException("No reflection on non-public fields allowed");
}
}
Obviamente, en el mundo real, es posible que desee comprobar si hay sólo un cierto subconjunto de clases "importantes" en el primer argumento. Y, como se señala en muchas otras respuestas, esto causará problemas para muchas bibliotecas de terceros.
- 1. Ruby no puede acceder a la variable fuera del método?
- 2. cómo acceder a una variable de clase de la clase externa de clase interna en rubí
- 3. Restringir la visibilidad constructor de la clase en Scala 2.9
- 4. Cómo acceder desde la clase no activable a la clase
- 5. Alcance variable fuera de la función jQuery
- 6. ¿Cómo acceder a la variable de clase externa sombreada desde la clase interna?
- 7. Cómo acceder a una variable desde la clase interna
- 8. Cómo restringir a los desarrolladores el uso de la reflexión para acceder a métodos privados y constructores en Java?
- 9. acceso variable fuera de la instrucción if
- 10. Cómo acceder a la sesión desde una clase de Java
- 11. Acceder a la variable estática de otra clase
- 12. Acceder a una variable de miembro protegida fuera de una clase
- 13. ¿Variable de Javascript fuera de la función?
- 14. ¿Cómo acceder a argv [] desde fuera de la función main()?
- 15. Acceder a una variable fuera de una instrucción 'if'
- 16. clase interna variable no final java
- 17. Java no puede acceder a los métodos de clase desde la instancia de clase
- 18. Acceder a la variable estática del objeto en Java
- 19. Acceder al valor de la variable final estática de Java a través de la reflexión
- 20. Método La clase interna local solo puede acceder a la variable local final.¿Por qué?
- 21. ¿Cómo hacer que la traducción funcione fuera de la clase?
- 22. Acceder a los archivos de la clase PHP fuera de ROBLE DOCUMENTOS
- 23. Variable de instancia genérica en la clase no genérica
- 24. Java: ¿Cómo puedo acceder al campo de una clase con un nombre almacenado en una variable?
- 25. ¿Cómo restringir el acceso al miembro de la clase anidado a la clase adjunta?
- 26. Eliminar la memoria de la variable no utilizada en java
- 27. ¿Cómo puedo acceder a la variable de tiempo en modelica
- 28. En Java, ¿cómo accedo a la clase externa cuando no estoy en la clase interna?
- 29. ¿Debería acceder a una variable dentro de la misma clase a través de una propiedad?
- 30. No se puede acceder a la variable global en jQuery $ .get dentro de la función
De forma predeterminada, ¿puede acceder a los campos privados a través de la reflexión? –
Sí. Y no creo que haya una forma simple de decirle a Java "sin reflexión en mis campos privados". – user949300