El lenguaje Java define diferentes tipos de datos, como los tipos básicos int, Double, etc., así como el objeto de clase principal de todas las clases, etc. Estos son tipos de nivel Java, y el proceso de procesamiento utilizando métodos locales requiere sus tipos correspondientes.
Los métodos nativos escritos en la capa Java se compilan en bytecode por el compilador. El Bytecode registrará diferentes tipos de parámetros en archivos de clase de acuerdo con la especificación, como B representa el byte, I representa int, j representa largo, etc. Entonces un método local de la siguiente manera se registra como (ljava/lang/objeto; ii) v.
Prueba de vacío nativo estático público (Object O, Int I, Int i2);
Los métodos correspondientes anteriores están registrados en el JVM. Cuando se ejecuta para llamar al método local, el tipo de datos local se convertirá de acuerdo con el mapa de tipo, como int-> jint y object-> Jobject. De hecho, Int y Jint son los mismos en C ++, solo use typedef para definir otro nombre. Jobject es un puntero. El motor de ejecución genera un objeto objeto al ejecutar la lógica de la capa Java. Tiene una estructura de datos especial en la capa JVM. El trabajo aquí es un puntero a esta estructura. Cuando necesita ser utilizado, se puede colocar en la estructura de datos de la capa JVM, y luego se puede operar. Además, OOP se usa en el JVM para representar punteros de objetos.
| Tipo java | Tipo nativo | valor |
|---|---|---|
| booleano | jboolean | Verdadero o falso |
| byte | jbyte | -128 ~ 127 |
| Corto | jshort | -POW (2,15) ~ POW (2,15) -1 |
| intencionalmente | jint | -POW (2,31) ~ POW (2,31) -1 |
| largo | jlong | -POW (2,63) ~ POW (2,63) -1 |
| flotar | jfloat | Número de punto flotante de precisión única IEEE754 |
| doble | jdouble | IEEE754 Número de punto flotante de doble precisión estándar |
| carbonizarse | jarro | Caracteres Unicode sin firmar de 16 bits |
Además de la asignación de tipo básico, otros tipos de objetos en la capa Java son tipos de referencia, por lo que el método local corresponde al tipo de trabajo. Además, también derivará algunas subclases de uso común, como JString, JClass, etc., como sigue,
clase _JObject {}; clase _JClass: public _JObject {}; class _JThRowable: public _JObject {}; class _JString: public _Jobject {}; class _jrray: public _JObject {}; class _jboolareanArray: public _jarray {{{}; _Jarray {}; class _JarRArray: public _Jarray {}; class _jshortArray: public _Jarray {}; class _JinTArray: public _Jarray {}; class _JlongarRAray: public _Jarray {}; class _jfloatArray: public _Jarray; : public _Jarray {}; class _jobjectArray: public _Jarray {};Puede ver que la clase _jobject está definida, que es una clase vacía, mientras que otras clases incluyen _jclass _jthrowable _jstring _Jarray, están todas heredadas de la clase _jobject. Además, el tipo de matriz también deriva 9 subclases, correspondientes a la matriz de tipo base y la matriz de tipo de referencia respectivamente.
Después de definir la clase, defina el alias de puntero. Aquí está el tipo de método local. Además, estas son definiciones de C ++. Si se trata de un compilador C, usará struct para definir _jobject, no clase.
typedef _JObject *Jobject; typedef _jclass *jclass; typedef _jThRowable *jThRowable; typedef _jString *jString; typedef _Jarray *jrray; typedef _JBOOLEANEAnEnArray *jbooleanAnAnArray; *jcharArray;typedef _jshortArray *jshortArray;typedef _jintArray *jintArray;typedef _jlongArray *jlongArray;typedef _jfloatArray *jfloatArray;typedef _jdoubleArray *jdoubleArray;typedef _jobjectArray *jobjectArray;
El tipo de referencia anterior se define como una clase vacía. Aquí entendemos la clase vacía en C ++. Por lo general, necesitamos definir una clase vacía de las siguientes dos maneras.
clase vacía {} struct vacía {}Después de la definición anterior, el tamaño de una clase vacía es 1, pero ¿de qué sirve una clase vacía si no hay nada? De hecho, se puede usar para distinguir diferentes objetos. Los diferentes objetos definidos por clases vacías tienen diferentes direcciones. Los objetos operados usando New también tienen diferentes punteros. Además, las clases vacías también pueden distinguir diferentes categorías.
Entonces, ¿cómo usamos estos asignaciones de tipo en conexión? En realidad es muy simple. La respuesta es convertir punteros. Como se mencionó anteriormente, los objetos en la capa Java tienen una cierta estructura de datos en el JVM, es decir, use OOP para representar punteros de objetos. Luego, el trabajo se puede convertir de la siguiente manera, donde el mango es el tipo de trabajo.
resultado de OOP = *reinterpret_cast <oop *> (handle);
Es muy conveniente procesarlo más después de convertirlo en OOP. Por ejemplo, si desea obtener algunos metadatos relacionados con la clase, puede usar Klass para obtenerlo.
Arriba, los tipos definidos por la capa Java tienen los tipos de datos correspondientes en el método local. Además, el código fuente de la capa Java se compila en Bytecode y guarda los tipos correspondientes a los parámetros del método local. Al ejecutar el JVM, el tipo correspondiente al método local se puede convertir de acuerdo con diferentes tipos. Los tipos definidos por el método local son todas las clases vacías. La función principal es unir objetos y distinguir los tipos de objetos. Se puede acceder al objeto o metadatos de clase a través de la conversión del puntero cuando sea necesario.