java - MethodHandle-¿De qué se trata?
jvm java-7 (3)
Estoy estudiando las nuevas funciones de JDK 1.7 y no puedo entender para qué está diseñado MethodHandle. Entiendo la invocación (directa) del método estático (y el uso de Core Reflection API que es sencillo en este caso). También entiendo la invocación (directa) del método virtual (no estático, no final) (y el uso de la API Core Reflection que requiere pasar por la jerarquía de la Clase obj.getClass().getSuperclass()
). La invocación de un método no virtual puede ser tratada como un caso especial del anterior.
Sí, soy consciente de que hay un problema con la sobrecarga. Si desea invocar el método, debe proporcionar la firma exacta. No se puede verificar el método de sobrecarga de manera fácil.
Pero, ¿de qué se trata MethodHandle? La API de reflexión le permite "mirar" las partes internas del objeto sin ninguna suposición (como implementó la interfaz). Puede inspeccionar el objeto para algún propósito. Pero, ¿qué es MethodHandle también está diseñado? ¿Por qué y cuándo debo usarlo?
ACTUALIZACIÓN: Estoy leyendo ahora este http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html artículo. De acuerdo con esto, el objetivo principal es simplificar la vida de los lenguajes de secuencias de comandos que se ejecutan sobre JVM, y no para el lenguaje Java en sí.
ACTUALIZACIÓN-2: termino de leer el enlace de arriba, algunas citas de allí:
La JVM será la mejor máquina virtual para crear lenguajes dinámicos, porque ya es una máquina virtual de lenguaje dinámico. E InvokeDynamic, mediante la promoción de lenguajes dinámicos a ciudadanos de JVM de primera clase, lo demostrará.
Usar la reflexión para invocar métodos funciona muy bien ... excepto por algunos problemas. Los objetos de método deben recuperarse de un tipo específico y no pueden crearse de manera general. <...>
... la invocación reflejada es mucho más lenta que la invocación directa. A lo largo de los años, la JVM se ha vuelto realmente buena para hacer que la invocación reflejada sea rápida. Las JVM modernas en realidad generan un montón de código entre bastidores para evitar una gran parte de las JVM antiguas que se manejan. Pero la verdad es que el acceso reflejado a través de cualquier número de capas siempre será más lento que una llamada directa, en parte porque el método de "invocación" completamente generado debe verificar y volver a verificar el tipo de receptor, los tipos de argumentos, la visibilidad y otros detalles, pero también porque los argumentos deben ser todos objetos (de modo que los primitivos se encajonan en el objeto) y deben proporcionarse como una matriz para cubrir todas las aridades posibles (de modo que los argumentos se encuadran en una matriz).
Es posible que la diferencia de rendimiento no importe para una biblioteca que realiza algunas llamadas reflejadas, especialmente si esas llamadas son principalmente para configurar dinámicamente una estructura estática en la memoria contra la cual puede hacer llamadas normales. Pero en un lenguaje dinámico, donde cada llamada debe usar estos mecanismos, es un golpe de rendimiento grave.
http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html
Entonces, para el programador de Java es esencialmente inútil. Estoy en lo cierto Desde este punto de vista, solo se puede considerar como una forma alternativa para Core Reflection API.
Es el precursor de Java 8 que proporciona soporte de idioma para MethodHandles. Podrá referirse a un método directamente y MethodHandles lo admitirá.
Lo que puedes hacer con MethodHandles son los métodos de curry, cambiar los tipos de parámetros y cambiar su orden.
Los manejadores de métodos pueden manejar tanto métodos como campos.
Otro truco que hace MethodHandles es usar directivas primitivas (en lugar de envolturas)
MethodHandles puede ser más rápido que usar la reflexión ya que hay un soporte más directo en la JVM, por ejemplo, pueden estar en línea. Utiliza la nueva instrucción dinámica invocada.
Piense en MethodHandle como una forma moderna, más flexible y más segura de hacer reflexiones.
Actualmente se encuentra en las primeras etapas de su ciclo de vida, pero con el tiempo tiene el potencial de ser optimizado para que se convierta más rápido que la reflexión, hasta el punto de que puede llegar a ser tan rápido como una llamada de método regular.
java.lang.reflect.Method
es relativamente lento y costoso en términos de memoria. Se supone que los manejadores de métodos son una forma "liviana" de pasar los punteros a las funciones que la JVM tiene la oportunidad de optimizar. A partir de JDK8, los controladores no están tan bien optimizados, y es probable que las lambdas se implementen inicialmente en términos de clases (como lo son las clases internas).