Maison  >  Article  >  Java  >  Méthode native Java Détails de la méthode native

Méthode native Java Détails de la méthode native

高洛峰
高洛峰original
2017-02-28 15:33:121297parcourir

Introduction détaillée à la méthode native Java Méthode native

1. Qu'est-ce que la méthode native

En termes simples, une méthode native est une interface permettant à Java d'appeler des non- code java. Une méthode native est une méthode Java dont l'implémentation est implémentée dans un langage non Java, tel que C. Cette fonctionnalité n'est pas propre à Java. De nombreux autres langages de programmation disposent de ce mécanisme. Par exemple, en C++, vous pouvez utiliser extern "C" pour indiquer au compilateur C++ d'appeler une fonction C.

"Une méthode native est une méthode Java dont l'implémentation est assurée par du code non-java."

Lors de la définition d'une méthode native, le corps d'implémentation n'est pas fourni ( Certains aiment définir une interface Java), car son implémentation est implémentée en externe par des langages non Java. , un exemple est donné ci-dessous :

 public class IHaveNatives
  {
   native public void Native1( int x ) ;
   native static public long Native2() ;
   native synchronized private float Native3( Object o ) ;
   native void Native4( int[] ary ) throws Exception ;
  }

Les déclarations de ces méthodes décrivent à quoi ressemble du code non-java dans ces codes java. View.

L'identifiant natif peut être utilisé avec tous les autres identifiants Java, sauf abstrait. C'est raisonnable, car native implique que ces méthodes ont des implémentations, mais ces implémentations ne sont pas Java, mais abstract indique clairement que ces méthodes n'ont aucune implémentation. Lorsque native est utilisée avec d'autres identifiants Java, sa signification n'est pas différente de celle d'une méthode non native. Par exemple, native static indique que cette méthode peut être appelée directement sans générer d'instance de classe, par exemple. vous souhaitez utiliser une méthode native pour l’appeler une bibliothèque de classes A C. La troisième méthode ci-dessus utilise la synchronisation native. La JVM exécutera un mécanisme de verrouillage de synchronisation avant d'entrer dans l'implémentation de cette méthode (tout comme le multi-threading de Java.)

Une méthode native peut renvoyer n'importe quel type Java, y compris les types non basiques, peuvent également être utilisés pour le contrôle des exceptions. L'implémentation de ces méthodes peut créer une exception et la lever, ce qui est très similaire aux méthodes Java. Lorsqu'une méthode native reçoit des types non basiques tels qu'un objet ou un tableau d'entiers, la méthode peut accéder aux éléments internes de ces types non basiques, mais cela rendra la méthode native dépendante de l'implémentation de la classe Java à laquelle vous accédez. Une chose à garder à l'esprit est que nous pouvons accéder à toutes les fonctionnalités Java dans une implémentation native d'une méthode native, mais cela dépend de l'implémentation des fonctionnalités Java auxquelles vous accédez, et cela est bien inférieur à l'utilisation de celles du langage Java. Les fonctionnalités sont pratiques et simples.

L'existence d'une méthode native n'aura aucun impact sur les autres classes appelant ces méthodes natives. En fait, les autres classes appelant ces méthodes ne savent même pas qu'elles appellent une méthode native. La JVM contrôlera tous les détails de l’appel des méthodes natives. Nous devons faire attention à la situation lorsque nous déclarons une méthode locale comme définitive. Les corps de méthodes implémentés en Java peuvent connaître des améliorations d'efficacité grâce à l'intégration lors de leur compilation. Cependant, on peut se demander si une méthode finale native peut également obtenir de tels avantages, mais il ne s'agit que d'un problème d'optimisation du code et n'a aucun impact sur l'implémentation fonctionnelle.

Si une classe contenant une méthode locale est héritée, la sous-classe héritera de cette méthode locale et pourra surcharger cette méthode en langage java (cela semble un peu étrange), pareil si une méthode locale identifiée par fianl, il ne peut pas être remplacé après avoir été hérité.
Les méthodes locales sont très utiles car elles étendent efficacement jvm. En fait, le code Java que nous écrivons a déjà utilisé des méthodes locales dans la mise en œuvre du mécanisme de concurrence Java (multi-threading) de Sun, dont beaucoup sont liées au fonctionnement. système Tous les points de contact utilisent des méthodes natives, ce qui permet aux programmes Java de transcender les limites du runtime Java. Avec les méthodes natives, un programme Java peut effectuer n’importe quelle tâche au niveau de l’application.

2.Pourquoi utiliser la méthode native

Java est très pratique à utiliser, mais certains niveaux de tâches ne sont pas faciles à implémenter en Java, ou quand on est très soucieux de l'efficacité du programme, voici le problème.

Interagir avec l'extérieur de l'environnement Java :

Parfois, les applications Java doivent interagir avec l'environnement extérieur à Java. C'est la principale raison pour laquelle les méthodes locales existent. Vous pouvez penser à la situation dans laquelle Java doit échanger des informations avec certains systèmes sous-jacents tels que le système d'exploitation ou certains matériels. Les méthodes locales sont exactement un tel mécanisme de communication : elles nous fournissent une interface très simple, et nous n'avons pas besoin de comprendre les détails fastidieux en dehors de l'application Java.

Interagir avec le système d'exploitation :

La JVM prend en charge le langage Java lui-même et la bibliothèque d'exécution. C'est la plateforme sur laquelle s'appuient les programmes Java. Elle se compose d'un interpréteur (interprétant le bytecode) et de quelques bibliothèques connectées au code local. Cependant, ce n’est pas un système complet après tout. Il repose souvent sur le support de certains systèmes sous-jacents. Ces systèmes sous-jacents sont souvent des systèmes d’exploitation puissants. En utilisant des méthodes natives, nous pouvons utiliser Java pour réaliser l'interaction entre jre et le système sous-jacent. Même certaines parties de la JVM sont écrites en C. De plus, si nous voulons utiliser certaines fonctionnalités du système d'exploitation que le langage Java lui-même fait. ne fournit pas d'encapsulation, nous devons également utiliser des méthodes natives.

Java de Sun

L'interpréteur de Sun est implémenté en C, ce qui lui permet d'interagir avec l'extérieur comme un C ordinaire. La plupart des jre sont implémentés en Java et interagissent également avec le monde extérieur via certaines méthodes locales. Par exemple : la méthode setPriority() de la classe java.lang.Thread est implémentée en java, mais elle appelle la méthode locale setPriority0() dans la classe. Cette méthode native est implémentée en C et implantée dans la JVM. Sur la plateforme Windows 95, cette méthode native appellera à terme l'API Win32 SetPriority(). Il s'agit d'une implémentation spécifique d'une méthode locale fournie directement par la JVM. Le plus souvent, la méthode locale est fournie par une bibliothèque de liens dynamiques externe (external Dynamic Link Library) puis appelée par la JVM.

3. Comment JVM fait fonctionner la méthode native :

Nous savons que lorsqu'une classe est utilisée pour la première fois, le bytecode de cette classe sera chargé en mémoire, et ne sera chargé qu’une seule fois. Une liste de tous les descripteurs de méthode de la classe est conservée à l'entrée du bytecode chargé. Ces descripteurs de méthode contiennent les informations suivantes : où le code de méthode est stocké, quels sont ses paramètres et le descripteur de méthode (catégorie publique), etc. sur.

S'il y a du natif dans un descripteur de méthode, ce bloc de descripteur aura un pointeur vers l'implémentation de la méthode. Ces implémentations se trouvent dans certains fichiers DLL, mais elles seront chargées dans l'espace d'adressage du programme Java par le système d'exploitation. Lorsqu'une classe avec une méthode native est chargée, sa DLL associée n'est pas chargée, donc le pointeur vers l'implémentation de la méthode n'est pas défini. Ces DLL ne seront chargées que lorsque la méthode native sera appelée, ce qui est réalisé en appelant java.system.loadLibrary(). ​

La dernière chose à noter est que l'utilisation de méthodes locales entraîne une surcharge et fait perdre de nombreux avantages de Java. Si nous n’avons pas le choix, nous pouvons choisir d’utiliser des méthodes locales.

Merci d'avoir lu, j'espère que cela pourra aider tout le monde, merci pour votre soutien à ce site !

Pour des articles plus détaillés sur la méthode native Java, veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn