La comprensión en profundidad de JVM - Método de Invocación

navegación de páginas blog personal (haga clic a la derecha de enlace para abrir un blog personal): Daniel lo lleve en la pila de tecnología 

No es que se ejecuta el mismo código de método de llamada al método, la única tarea consiste en determinar la versión teatral llamada al método denominado método (que es, que la invocación de métodos) todavía tienen que hacer frente a los procesos operativos específicos dentro del método. Todas las llamadas a métodos en archivos de clase dentro de la tienda se encuentran referencias simbólicas, no la capa de memoria de direcciones de entrada método (es decir antes de la referencia directa) en la operación real.

Resolver

Símbolos para todo método de destino es un método llamado de memoria constante en archivos de clase dentro de las referencias en la fase de resolución de la carga de clases, que será parte de la referencia simbólica en referencia directa, esto se puede resolver basa en la premisa de que: el método antes de ejecutar realmente el programa puede determinar que hay una versión de la llamada, y llamar a la versión de este método en tiempo de ejecución es inmutable. En otras palabras, llama a la diana en el código de programa escrito el compilador para compilar el momento ha sido finalizado. Hay llamadas de este tipo de método se llama el análisis sintáctico (Resolución), en línea con este requisito en el lenguaje Java métodos estáticos y métodos privados .

instrucción de llamada al método

  • invokestatic: Se utiliza para invocar un método estático.
  • invokespecial: Por ejemplo <init> (métodos, procedimientos y métodos privados clase padre) llamada al constructor.
  • invokevirtual: Llamada para todos los métodos virtuales.
  • invokeinterface: Para la llamada interfaz método determinará entonces el objeto que implementa esta interfaz en tiempo de ejecución.
  • invokedynamic: En primer lugar, una dinámica método de análisis de punto de invocación calificador referencia en tiempo de ejecución y luego ejecutar el método.

4 frente a la instrucción de llamada, la lógica de despacho se curan dentro de una máquina virtual de Java, y invokedynamicmétodo de guía de instrucciones de lógica de despacho es fijado por el usuario decida.

El método de clasificación

Método en el lenguaje Java se dividen en "métodos virtuales" y "métodos no virtuales".

  • Los métodos no virtuales : carga de clases cuando el símbolo de referencia se puede resolver con el método de referencia directa. Por ejemplo: el método estático, métodos privados, constructores ejemplo, los métodos, y el método modificado final de los padres.
  • métodos virtuales: necesidades referencia simbólica a ser convertidos en tiempo de ejecución a la referencia directa, como de despacho.

asignación

Despacho (Dispatch) que puede ser estático o dinámico puede, de acuerdo con el número de casos asignados sobre la base de la cantidad se puede dividir en despacho única y múltiple de despacho. Estos dos tipos de combinaciones de dos vías despachos constituye una asignación estática única, múltiple estática de despacho, la asignación dinámica única, dinámica envío múltiple de despacho cuatro tipos de combinaciones.

asignación estática

Confiar en tipo estático determina el método para la realización de la versión de envío de acción se llama asignación estática. Asignación estática de la manifestación más típica es la aplicación de la sobrecarga de métodos, la máquina virtual (o precisamente compilador) cuando sobrecargado por los parámetros de tipo estático, como base para la determinación.

public class StaticDispatch {

    static abstract class Human {
    }

    static class Man extends Human {
    }

    static class Woman extends Human {
    }

    public void sayHello(Human guy) {
        System.out.println("hello,guy!");
    }

    public void sayHello(Man guy) {
        System.out.println("hello,gentleman!");
    }

    public void sayHello(Woman guy) {
        System.out.println("hello,lady!");
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        StaticDispatch sr = new StaticDispatch();
        sr.sayHello(man);
        sr.sayHello(woman);
    }
}

El resultado:

hello,guy!
hello,guy!
 Human man = new Man();

Aquí Human es la variable "tipo estático" (tipo estático), o "Apariencia Tipo" (aparente Tipo); Manes decir, "el tipo real de" variable (tipo real) o "tipo de tiempo de ejecución" (autonomía Tipo).

La asignación dinámica

Nosotros en tiempo de ejecución se llama método de envío dinámico de determinar el tipo real del proceso de asignación versión ejecutada. La manifestación más típica se reescribe.

public class DynamicDispatch {

    static abstract class Human {
        abstract void sayHello();
    }

    static class Man extends Human {
        public void sayHello() {
            System.out.println("hello,Man!");
        }
    }

    static class Woman extends Human {
        public void sayHello() {
            System.out.println("hello,Woman!");
        }
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        man.sayHello();
        woman.sayHello();
    }
}

El resultado:

hello,Man!
hello,Woman!

Esperamos con código de bytes principal método por orden javap:

...
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: new           #2                  // class com/xiaolyuh/DynamicDispatch$Man
         3: dup
         4: invokespecial #3                  // Method com/xiaolyuh/DynamicDispatch$Man."<init>":()V
         7: astore_1
         8: new           #4                  // class com/xiaolyuh/DynamicDispatch$Woman
        11: dup
        12: invokespecial #5                  // Method com/xiaolyuh/DynamicDispatch$Woman."<init>":()V
        15: astore_2
        16: aload_1
        17: invokevirtual #6                  // Method com/xiaolyuh/DynamicDispatch$Human.sayHello:()V
        20: aload_2
        21: invokevirtual #6                  // Method com/xiaolyuh/DynamicDispatch$Human.sayHello:()V
        24: return
      LineNumberTable:
        line 27: 0
        line 28: 8
        line 29: 16
        line 30: 20
        line 31: 24
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      25     0  args   [Ljava/lang/String;
            8      17     1   man   Lcom/xiaolyuh/DynamicDispatch$Human;
           16       9     2 woman   Lcom/xiaolyuh/DynamicDispatch$Human;
}
...

Encontramos código de bytes: En el método principal, sayHello()llamar a los métodos del símbolo correspondiente a la misma referencia, com/xiaolyuh/DynamicDispatch$Human.sayHello:()V . Aquí podemos sacar una conclusión: en el caso de distribución dinámica, en tiempo de compilación no somos capaces de determinar el método de referencia directa, entonces es cómo lograr que llama al método sobrecargado? La cuestión clave es en invokevirtualla instrucción, la ejecución invokevirtualde comandos, el invokevirtualcomando se vaya a determinar la versión de la llamada al método.

Operación instrucciones de proceso invokevirtual

  1. El tipo real del primer elemento de la pila para encontrar el objeto puntiagudo operando, se hace referencia como C.
  2. Si se encuentra en el tipo C en las constantes de descriptor de método y nombres simples son consistentes, entonces la verificación de los derechos de acceso, si este método devuelve una referencia directa a encontrar el final del proceso; no regresan por java.lang.IllegalAccessError excepción.
  3. De lo contrario, subir la herencia de acuerdo con la respectiva clase padre C y el segundo paso del proceso de validación de la búsqueda. 4. Si no siempre encontrar el método correcto, se produce una excepción java.lang.AbstractMethodError.

Es precisamente debido a la ejecución de instrucciones invokevirtual del primer paso consiste en determinar el destino efectivo del tipo en tiempo de ejecución, por lo que las dos llamadas en invokevirtual método de instrucción no es el símbolo de la constante de referencias piscina resolución de la referencia directa a lo largo, lo hará de acuerdo con el tipo real de las versiones del método receptor para seleccionar el método, este proceso es el método Java a la naturaleza de reescritura.

Cuando la subclase se declara cuando el campo es la clase padre del mismo nombre, aunque existan los dos campos en una subclase de la memoria, pero el campo subclase oscurece la clase padre del mismo campo de nombre

Asignación dinámica

Debido a que las lleva a cabo el método dinámico con mucha frecuencia, y el envío método dinámico en versiones de tiempo de ejecución de selección, la búsqueda de un método objetivo adecuado en el tipo real de metadatos del destinatario, y por lo tanto, las consideraciones virtual de rendimiento de ejecución de la aplicación de la máquina de Java, la máquina virtual se basa en escriba una región en el proceso de establecimiento de tabla de métodos virtual (tabla de métodos virtual, también llamado el vtable, correspondiente a esto, una tabla de métodos de interfaz será utilizado cuando se realiza la --interface invokeinterface tabla de métodos, denominado en ITable), utilizando la tabla de método virtual índice de sustituir las operaciones de búsqueda de metadatos para mejorar el rendimiento.

tabla de métodos virtuales almacena las direcciones de la entrada método real. Si un método no se reemplaza en una subclase, el mismo método que la entrada de dirección subclase dirección de entrada vtable y el padre es la misma, para lograr el punto de entrada de la clase padre. Si la clase hija reemplaza el método de esta subclase dirección de la tabla de métodos virtuales serán reemplazados versión implementada de la dirección de entrada al punto de la subclase. En los dibujos, todo el método de volver a escribir Hijo del Padre, Hijo, y por lo tanto de ninguna manera de la flecha direccional padre datos del tipo de mesa. Padre Hijo, pero no se sobreescriben y de los métodos de objeto, su tabla de métodos todos los métodos heredados del objeto al tipo de datos de objetos de punto.

Después de las tablas método virtual normalmente se inicializan en la fase de conexión de la carga de clases, preparamos el valor inicial del tipo de variable, la máquina virtual a la mesa método virtual de esta clase juntos también inicializa.

despacho simple y múltiple de despacho

parámetros y métodos de enfoque del receptor se hace referencia como variables en el método. ¿Cuántas fueron asignados en base a la cantidad, se puede dividir en un solo envío y despachar el envío múltiple de dos tipos. Envío de una sola diana se selecciona variables en un método, se selecciona objetivo expedición múltiple y los dos casos anteriores método cantidades.

  • Asignación estática necesita ser determinado de acuerdo con los tipos de parámetros de llamada método estático y métodos de-dos variables, por lo que pertenecen a la expedición múltiple.
  • Asignación dinámica sólo necesitan para determinar el tipo de llamada el método de acuerdo con la cantidad real de una parcela, pertenece a una sola asignación.

Durante el reenvío dinámico, la firma del método es seguro, no se convertirá en los parámetros del método, las llamadas a métodos dependerá del tipo real del parámetro.

resumen

llamada resolución debe ser un proceso estático, se determina por completo en tiempo de compilación, la fase de análisis de carga de clases implicará referencias a todos los símbolos en una referencia clara y directa, no necesita volver a correr demorado la terminación. Despacho (Dispatch) complejo tendrá que llamar a muchos, puede ser estática o dinámica pueden, de acuerdo con el número de casos asignados basándose en la cantidad se pueden dividir en despacho única y múltiple de despacho. Estos dos tipos de combinaciones de dos vías despachos constituye una asignación estática única, múltiple estática de despacho, la asignación dinámica única, dinámica envío múltiple de despacho cuatro tipos de combinaciones.

aprendizaje adjunta Java / C / C ++ / máquina / Algoritmos y Estructuras de Datos / front-end / Android / Python / programador de lectura / libros individuales libros Daquan:

(Haga clic en la derecha para abrir allí en el blog personal en seco): seca Técnica de floración
===== >> ① [Java Daniel lo lleve en el camino a avanzado] << ====
===== >> ② [+ acm algoritmo de estructura de datos Daniel lo lleve en el camino a avanzado] << ===
===== >> ③ [base de datos de Daniel lo lleve en el camino a avanzado] << == ===
===== >> ④ [Daniel cliente web para llevarlo en el camino a avanzado] << ====
===== >> ⑤ [pitón máquina de aprendizaje y Daniel le llevará a la entrada camino avanzada] << ====
===== >> ⑥ [arquitecto Daniel lo lleve en el camino a avanzado] << =====
===== >> ⑦ [C ++ Daniel avanzó para llevarlo en el camino] << ====
===== >> ⑧ [ios Daniel lo lleve en el camino a avanzado] << ====
=====> > ⑨ [seguridad web Daniel lo lleve en el camino a avanzado] << =====
===== >> ⑩ [sistema operativo Linux y Daniel se toman en el camino a avanzado] << = ====

No hay frutas consumidas, espero que jóvenes amigos, amigos desea aprender técnicas, superando todos los obstáculos en el camino de la carretera determinada para atar en la tecnología, entender el libro, y luego golpear en el código, entender el principio, e ir a la práctica, se se le dan vida, su trabajo, su futuro un sueño.

Publicados 141 artículos originales · ganado elogios 17 · vistas 8162

Supongo que te gusta

Origin blog.csdn.net/JKX_geek/article/details/104878254
Recomendado
Clasificación