¿Cuál es la función de la palabra clave nativa en Java?
La siguiente es una introducción de tres puntos al nativo de Java:
1. ¿Qué es el método nativo?
En pocas palabras, un método nativo es un método no nativo de Java. -Interfaz de código java. Un método nativo es un método Java cuya implementación se implementa en un lenguaje que no es Java, como C. Esta característica no es exclusiva de Java. Muchos otros lenguajes de programación tienen este mecanismo. Por ejemplo, en C++, puede usar "C" externo para indicarle al compilador de C++ que llame a una función de C.
"Un método nativo es un método Java cuya implementación se proporciona mediante código que no es Java."
Cuando se define un método nativo, no se proporciona el cuerpo de implementación (algo así como definir un interfaz java), porque su implementación se implementa externamente mediante lenguajes que no son java. , se proporciona un ejemplo a continuación:
public class IHaveNatives
{
nativo público void Native1( int x
nativo estático); public long Native2();
nativo sincronizado privado float Native3(Objeto o);
nativo void Native4(int[] ary) lanza una excepción;
}
La declaración de estos métodos describe cómo se ve (ver) algún código que no es Java en este código Java.
El identificador nativo se puede usar con todos los demás identificadores de Java, excepto los abstractos. . Esto es razonable, porque nativo implica que estos métodos tienen implementaciones, pero estas implementaciones no son Java, pero abstracto indica claramente que estos métodos no tienen implementación. Cuando se usa nativo con otros identificadores de Java, su significado no es diferente del método no nativo. Por ejemplo, nativo estático indica que este método se puede llamar directamente sin generar una instancia de la clase. Esto es muy conveniente, por ejemplo. desea utilizar un método nativo para llamarlo a la biblioteca de clases A C. El tercer método anterior utiliza sincronización nativa. La JVM ejecutará un mecanismo de bloqueo de sincronización antes de ingresar a la implementación de este método (al igual que el subproceso múltiple de Java).
Un método nativo puede devolver cualquier tipo de Java, incluidos los que no lo son. -tipos básicos, y también pueden ser controlados por excepciones. La implementación de estos métodos puede crear una excepción y lanzarla, que es muy similar a los métodos de Java. Cuando un método nativo recibe algunos tipos no básicos como un objeto o una matriz de enteros, el método puede acceder a las partes internas de estos tipos no básicos, pero esto hará que el método nativo dependa de la implementación de la clase Java a la que está accediendo. Una cosa a tener en cuenta es que podemos acceder a todas las funciones de Java en una implementación nativa de un método nativo, pero esto depende de la implementación de las funciones de Java a las que accede, y hacerlo es muy inferior a usar aquellas en el lenguaje Java. Las funciones son cómodas y sencillas.
La existencia de métodos nativos no tendrá ningún impacto en otras clases que llamen a estos métodos nativos. De hecho, otras clases que llamen a estos métodos ni siquiera saben que están llamando a un método nativo. La JVM controlará todos los detalles de la llamada a métodos nativos. Necesitamos prestar atención a la situación cuando declaramos un método local como final. Los cuerpos de métodos implementados en Java pueden experimentar mejoras de eficiencia debido a la incorporación en línea cuando se compilan. Sin embargo, es cuestionable si un método final nativo también puede obtener tales beneficios, pero esto es solo una cuestión de optimización del código y no tiene ningún impacto en la implementación funcional.
Si se hereda una clase que contiene un método local, la subclase heredará el método local y puede anular este método en el lenguaje Java (esto puede parecer un poco extraño, de manera similar, si un método local es una identidad fianl). , no se puede anular después de ser heredado.
Los métodos locales son muy útiles porque extienden efectivamente jvm. De hecho, el código Java que escribimos ya ha utilizado métodos locales en la implementación del mecanismo de concurrencia Java (multiproceso) de Sun. El sistema operativo utiliza métodos nativos, lo que permite que los programas Java trasciendan los límites del tiempo de ejecución de Java. Con métodos nativos, un programa Java puede realizar cualquier tarea a nivel de aplicación.
2. Por qué utilizar el método nativo
Java es muy conveniente de usar, pero algunos niveles de tareas no son fáciles de implementar en Java, o cuando estamos muy preocupados por la eficiencia de el programa, surgen problemas. Ya viene.
Interactuar con el entorno externo a Java:
A veces las aplicaciones Java necesitan interactuar con el entorno externo a Java. Esta es la razón principal por la que existen métodos locales. Puede pensar en la situación en la que Java necesita intercambiar información con algunos sistemas subyacentes, como el sistema operativo o algún hardware. Los métodos locales son exactamente ese mecanismo de comunicación: nos proporcionan una interfaz muy simple y no necesitamos comprender los detalles engorrosos fuera de la aplicación Java.
Interactuando con el sistema operativo:
La JVM soporta el propio lenguaje Java y la biblioteca de tiempo de ejecución. Es la plataforma en la que se basan los programas Java. Consta de un intérprete (interpreta. bytecode) y algunas bibliotecas que se conectan al código nativo. Sin embargo, después de todo, no es un sistema completo. A menudo depende del soporte de algunos sistemas subyacentes. Estos sistemas subyacentes suelen ser sistemas operativos potentes. Al usar métodos nativos, podemos usar Java para realizar la interacción entre jre y el sistema subyacente. Incluso algunas partes de la JVM están escritas en C. Además, si queremos usar algunas características del sistema operativo que hace el propio lenguaje Java. No proporcionamos encapsulación, también necesitamos usar métodos nativos.
Java de Sun
El intérprete de Sun está implementado en C, lo que le permite interactuar con el exterior como un C normal. La mayor parte de jre se implementa en java y también interactúa con el mundo exterior a través de algunos métodos locales. Por ejemplo: el método setPriority() de la clase java.lang.Thread está implementado en Java, pero llama al método local setPriority0() en la clase. Este método nativo se implementa en C y se implanta dentro de la JVM. En la plataforma Windows 95, este método nativo eventualmente llamará a la API Win32 SetPriority(). Esta es una implementación específica de un método local proporcionado directamente por la JVM. Más a menudo, el método local es proporcionado por una biblioteca de enlaces dinámicos externos (biblioteca de enlaces dinámicos externos) y luego la JVM lo llama.
3. ¿Cómo hace JVM que se ejecute el método nativo?
Sabemos que cuando se usa una clase por primera vez, el código de bytes de esta clase se cargará en la memoria. sólo se cargará una vez. Se mantiene una lista de todos los descriptores de métodos de la clase en la entrada del código de bytes cargado. Estos descriptores de métodos contienen la siguiente información: dónde se almacena el código del método, qué parámetros tiene y la categoría del descriptor del método (público). en.
Si un descriptor de método contiene nativo, el bloque descriptor tendrá un puntero a la implementación del método. Estas implementaciones se encuentran en algunos archivos DLL, pero el sistema operativo las cargará en el espacio de direcciones del programa Java. Cuando se carga una clase con un método nativo, su DLL asociada no se carga, por lo que no se establece el puntero a la implementación del método. Estas DLL no se cargarán hasta que se llame al método nativo, lo que se logra llamando a java.system.loadLibrary().
Lo último que hay que tener en cuenta es que el uso de métodos nativos supone una sobrecarga y se pierden muchos de los beneficios de Java. Si no tenemos otra opción, podemos optar por utilizar métodos locales.