2010-01-18 30 views

Respuesta

19

Esto es necesario para escenarios como la comunicación remota, la serialización, la materialización, etc. No debe utilizarlo a ciegas, pero tenga en cuenta que estas instalaciones tienen siempre disponibles en cualquier sistema (básicamente, dirigiéndose a la memoria directamente) . La reflexión simplemente lo formaliza y coloca controles y controles en el camino, que no está viendo porque presumiblemente se ejecuta con "plena confianza", por lo que ya es más fuerte que el sistema que se está protegiendo.

Si prueba esto en confianza parcial, verá mucho más control sobre el estado interno.

¿Es un antipatrón?

Solo si su código lo usa de manera inapropiada. Por ejemplo, considere la siguiente (válido para un contrato de datos de WCF):

[DataMember] 
private int foo; 

public int Foo { get {return foo;} set {foo = value;} } 

¿Es incorrecto para WCF para apoyar esto? Sospecho que no ... hay múltiples escenarios en los que desea serializar algo que no es parte de la API pública, sin tener una DTO separada. Del mismo modo, LINQ-to-SQL se materializará en miembros privados si así lo eliges.

+0

¿Qué es * remoting *? –

+0

@Tomas un mecanismo no construido para hablar entre aplicaciones-dominios. Estos pueden estar en proceso o en máquinas separadas en diferentes países. –

+0

"hay varios escenarios en los que desea serializar algo que no es parte de la API pública": solo 2 posibilidades: la API es incorrecta y debe corregirse o no tiene que serializar ese "algo". –

22

La accesibilidad de los miembros no es una función de seguridad. Está ahí para proteger al programador contra sí mismo. Ayuda a implementar la encapsulación, pero de ninguna manera es una característica de seguridad.

La reflexión es lo suficientemente tediosa como para que la gente no salga de su camino para usarla para acceder a los miembros no públicos. También es bastante lento. La reflexión normalmente se usa solo en casos especiales. Sin embargo, nada puede proteger completamente contra la estupidez humana, si alguien quiere abusar de la reflexión puede hacerlo fácilmente, pero incluso sin la API de reflexión, pueden lograr lo mismo (si se ejecutan con plena confianza, eso es) si están lo suficientemente determinados

+3

+1 para "la accesibilidad del miembro no es una característica de seguridad". –

+1

+1 para lento .... –

-1

La reflexión es absolutamente necesaria para un depurador. Imagine que está avanzando en su programa y no puede ver los valores de sus variables privadas. Esa es probablemente la razón por la cual la reflexión funciona en .NET y Java de la manera en que funciona, para que la depuración sea realmente fácil.

Si no necesitamos depuradores, entonces puedo imaginar que la reflexión estaría restringida más en el espíritu de OOP.

+13

El depurador no usa la reflexión; el depurador habla directamente con las interfaces de depuración especiales del CLR. Además, dado que el depurador es totalmente confiable, podría generar y ejecutar código no verificable que acceda directamente a los miembros privados. –

+0

El depurador existe incluso en lenguajes que normalmente no tienen reflejo ([C++] (http://stackoverflow.com/q/359237/607407)), y en aplicaciones binarias accede directamente a los desplazamientos de memoria. –

3

Porque está especificado en el ECMA specification, 9 Metadata.

+0

No puedo encontrar lo que quieres decir. ¿Por qué no usas comillas? Pensé que Stack Overflow no permitía solo publicar un enlace por alguna razón ... –

Cuestiones relacionadas