settitle - reflection java 8
¿Por qué usar la reflexión para acceder a los miembros de la clase cuando MethodHandle es más rápido? (2)
Con el lanzamiento de Java 7 vino MethodHandle
, que permite a un usuario invocar un método como si usara su MethodHandle
subyacente. En particular, la clase MethodHandles.Lookup
proporciona métodos de fábrica para crear manejadores de métodos para acceder a los miembros de la clase:
Los métodos de fábrica en un objeto de búsqueda corresponden a todos los principales casos de uso de métodos, constructores y campos. Cada identificador de método creado por un método de fábrica es el equivalente funcional de un comportamiento de bytecode particular.
Funcionalmente, esto es más o menos equivalente a usar la reflexión para acceder a estos mismos miembros de clase, pero los controles de método son más rápidos que la reflexión .
Entonces, ¿hay alguna razón para seguir utilizando funcionalidades de reflexión como Field#get(..)
/ Method.invoke(..)
o estos métodos son efectivamente obsoletos con la introducción de los controladores de métodos más rápidos?
Tenga en cuenta que si bien los controles de los métodos se introdujeron en Java 7, mi pregunta se refiere principalmente a Java 8, en la que se optimizaron para alcanzar supuestamente el rendimiento aproximadamente igual a las llamadas de campo / método directas, superando la capacidad de reflexión.
Los controles de reflexión y de método tienen diferentes propósitos y existen en diferentes niveles de abstracción. Debe usar el que sea adecuado para el problema que está resolviendo.
La reflexión es un mecanismo de introspección de propósito general, que incluye muchas características de las que carece el mecanismo de manejo del método, como enumerar los miembros de una clase ( Class.getMethods()
), inspeccionar las características de un miembro como sus banderas de accesibilidad, inspeccionar genéricos Firmas de miembros, etc.
Además, los objetos reflectantes se pueden compartir libremente sin otorgar acceso al accionista, ya que las verificaciones de acceso se realizan en cada invocación; El método maneja conferir al usuario la capacidad de invocar. Así que también tienen diferentes implicaciones de seguridad.
Los manejadores de métodos son un mecanismo de bajo nivel para encontrar, adaptar e invocar métodos. Mientras que la invocación a través de los manejadores de métodos es más rápida que a través de la reflexión (aunque hasta la fecha, la invocación directa de bytecode es generalmente más rápida que la invocación de manejadores de métodos), los manejadores de métodos también son mucho más difíciles de usar, ya que no realizan automáticamente las adaptaciones que los usuarios de Java esperan ( como convertir un argumento de cadena a objeto), lo que resulta en errores de vinculación.
La biblioteca de reflexión está dirigida a usuarios de Java de uso general; La capa de control del método se dirige más a los escritores de compilación y lenguaje en tiempo de ejecución. Elige la herramienta diseñada para el trabajo.
tl; dr No. Debería usar (y preferir) MethodHandles
a la Core Core Reflection API cuando pueda.
MethodHandles.Lookup
access dice (en parte),
A diferencia de la Core Reflection API, donde el acceso se verifica cada vez que se invoca un método reflexivo, la comprobación del acceso al control del método se realiza cuando se crea el controlador del método .