2011-12-23 10 views
7

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?

+0

De forma predeterminada, ¿puede acceder a los campos privados a través de la reflexión? –

+0

Sí. Y no creo que haya una forma simple de decirle a Java "sin reflexión en mis campos privados". – user949300

Respuesta

2

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

8

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.

+0

+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

+0

@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

+0

@ 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

1

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.

0

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.

Cuestiones relacionadas