2011-03-18 9 views
6

¿java.lang.reflect.Method es seguro?¿Es seguro el subproceso java.lang.reflect.Method?

El resultado de la creación de perfiles de mi programa mostró que Class.getMethod() requirió un tiempo de computación considerable cuando se lo llamó muchas veces, un poco más de lo que esperaba. Puedo llamar esto una vez y almacenar el método resultante en algún lugar de fácil acceso. Pero luego, varios hilos de trabajador web utilizarán el objeto Method almacenado al mismo tiempo.

¿Esto es seguro?

Respuesta

5

El método es seguro de usar entre varios subprocesos siempre que no cambie el estado del método después de hacerlo disponible para múltiples hilos.eg Puede llamar a setAccessible (true) y setAccessible (false) en dos subprocesos y el resultado no sería seguro para subprocesos. Sin embargo, esto no tiene un buen uso.

En resumen, Method.setAccessible() no es técnicamente seguro para subprocesos, pero debería poder usarlo de manera segura para hilos.

+0

Por cierto, ¿no es 'setAccessible' una fuga de seguridad? Si algún código tiene el derecho de establecer algo accesible, más adelante otro código puede venir y usar el método privado sin más controles de seguridad. –

+0

A menos que su SecurityManager lo impida, puede acceder a métodos locales y privados protegidos y de paquetes. Mejora el rendimiento de acceso de incluso los métodos públicos anulando los controles. –

+0

Sí, estoy hablando de un caso con el administrador de seguridad instalado ... y diferentes privilegios para diferentes partes del código. Pero será mejor que abra otra pregunta sobre esto que usar los comentarios a una pregunta no relacionada para esto. –

4

Se garantiza que las clases Java se definan solo una vez por instancia de ClassLoader, por lo que puede suponer que la definición, incluidos los métodos y sus firmas, no cambiará con el tiempo, para que pueda "almacenarlos" en caché .

Sin embargo, tenga en cuenta que las clases con el mismo nombre completamente calificado (nombre de paquete + clase) se pueden definir de manera diferente por instancias de ClassLoader separadas.

0

La definición de la clase no va a cambiar, así que a menos que esté cargando diferentes clases en diferentes subprocesos (de bibliotecas separadas, por ejemplo), el objeto Método debería ser seguro para subprocesos. (Por supuesto, si el método que se llama mediante reflexión es seguro para subprocesos es una pregunta diferente.)

Cuestiones relacionadas