Le langage Java définit différents types de données, tels que les types de base INT, Double, etc., ainsi que l'objet de classe parent de toutes les classes, etc. Ce sont des types de niveau Java, et le processus de traitement utilisant des méthodes locales nécessite leurs types correspondants.
Les méthodes natives écrites dans la couche Java sont compilées en bytecode par le compilateur. Le bytecode enregistrera différents types de paramètres dans les fichiers de classe en fonction de la spécification, tels que B représente l'octet, I représente Int, J représente longtemps, etc. Ensuite, une méthode locale comme suit est enregistrée comme (Ljava / Lang / Object; ii) v.
Test de void natif statique public (objet O, int i, int i2);
Les méthodes correspondantes ci-dessus sont enregistrées dans le JVM. Lorsqu'il est exécuté pour appeler la méthode locale, le type de données local sera converti en fonction de la carte de type, telle que int-> jint et objet-> jobject. En fait, INT et JINT sont les mêmes en C ++, utilisez simplement TypeDEF pour définir un autre nom. Jobject est un pointeur. Le moteur d'exécution génère un objet d'objet lors de l'exécution de la logique de couche Java. Il a une structure de données spéciale dans la couche JVM. Le Jobject est ici un pointeur de cette structure. Lorsqu'il doit être utilisé, il peut être jeté dans la structure des données de la couche JVM, puis il peut être utilisé. De plus, la POO est utilisée dans le JVM pour représenter les pointeurs d'objets.
| Type java | Type natif | valeur |
|---|---|---|
| booléen | Jboolean | Vrai ou faux |
| octet | JBYTE | -128 ~ 127 |
| Court | jshort | -Pow (2,15) ~ POW (2,15) -1 |
| int | jint | -Pow (2,31) ~ POW (2,31) -1 |
| long | jlong | -Pow (2,63) ~ POW (2,63) -1 |
| flotter | jfloat | Numéro de point flottant SEUX-PROCISION IEEE754 standard |
| double | jdouble | IEEE754 Numéro de point flottant à double précision standard |
| carboniser | jara | Caractères Unicode 16 bits non signés |
En plus du mappage de type de base, d'autres types d'objets dans la couche Java sont des types de référence, donc la méthode locale correspond au type de travail. De plus, il tirera également certaines sous-classes couramment utilisées, telles que JString, JClass, etc., comme suit,
classe _Jobject {}; classe _jclass: public _Jobject {}; classe _JThrowable: public _Jobject {}; classe _jstring: public _jobject {}; classe _jrray: public _jobject {}; classe _jboolarray: public _jArray {}; class _jboolArray: public _jArray {}; Class _jByTay _JArray {}; classe _JCharArray: public _JArray {}; classe _jshortArray: public _JArray {}; classe _jintarray: public _JArray {}; classe _jlongarray: public _jarray {}; class _jfloatray: public _jarray {}; Class _jfloatRay: public _jarray {}; Class _jfloatray: public _JArray {}; Class _jfloatRay: Public _JArray {}; Class; _jDoublearray: public _jarray {}; class _jObjectArray: public _jArray {};Vous pouvez voir que la classe _JObject est définie, qui est une classe vide, tandis que d'autres classes incluent _jclass _jthrowable _jstring _jarray, sont toutes héritées de la classe _Jobject. De plus, le type de tableau dérive également 9 sous-classes, correspondant au tableau de type de base et au tableau de type de référence respectivement.
Après avoir défini la classe, définissez l'alias du pointeur. Voici le type de la méthode locale. De plus, ce sont des définitions C ++. S'il s'agit d'un compilateur C, il utilisera Struct pour définir _JOBJECT, pas la classe.
typedef _jObject * jobject; typedef _jclass * jclass; typedef _jthrowable * jThrowable; typedef _jstring * jstring; typedef _jarray * jrray; typedef _jboolEanArray * jbooleanarray; typeDarray * jCararray; typedef _jshortArray * JShortArray; typedef _jintArray * jintarray; typedef _jlongarray * jlongarray; typedef _jfloatArray * jfloatArray; typedef _jdoublearray * jdoublearray; typedef _JobjectArray * jobraday;
Le type de référence ci-dessus est défini comme une classe vide. Ici, nous comprenons la classe vide en C ++. Habituellement, nous devons définir une classe vide de deux manières suivantes.
classe vide {} struct vide {}Après la définition ci-dessus, la taille d'une classe vide est 1, mais à quoi sert une classe vide s'il n'y a rien? En fait, il peut être utilisé pour distinguer différents objets. Différents objets définis par des classes vides ont des adresses différentes. Les objets opérés à l'aide de nouveaux ont également des pointeurs différents. De plus, les classes vides peuvent également distinguer différentes catégories.
Alors, comment utilisons-nous ces mappages de type en relation? C'est en fait très simple. La réponse est de convertir des pointeurs. Comme mentionné précédemment, les objets de la couche Java ont une certaine structure de données dans le JVM, c'est-à-dire utiliser la POO pour représenter les pointeurs d'objets. Ensuite, le travail peut être converti comme suit, où la poignée est le type de travail.
OOP result = * reinterpret_cast <oop *> (manche);
Il est très pratique de le traiter davantage après l'avoir converti en POO. Par exemple, si vous souhaitez obtenir des métadonnées liées à la classe, vous pouvez utiliser Klass pour l'obtenir.
Ci-dessus, les types définis par la couche Java ont des types de données correspondants dans la méthode locale. De plus, le code source de la couche Java est compilé en bytecode et enregistre les types correspondant aux paramètres de la méthode locale. Lors de l'exécution du JVM, le type correspondant à la méthode locale peut être converti en fonction de différents types. Les types définis par la méthode locale sont toutes des classes vides. La fonction principale est de lier les objets et de distinguer les types d'objets. L'objet ou les métadonnées de classe sont accessibles via la conversion du pointeur lorsque cela est nécessaire.