Java 언어는 기본 유형 int, Double 등과 같은 다양한 데이터 유형 및 모든 클래스의 부모 클래스 객체 등을 정의합니다. 이는 Java 레벨 유형이며 로컬 방법을 사용하는 처리 프로세스에는 해당 유형이 필요합니다.
Java 레이어에 작성된 기본 방법은 컴파일러에 의해 바이트 코드로 컴파일됩니다. 바이트 코드는 사양에 따라 다른 유형의 매개 변수를 클래스 파일에 기록합니다. 예 : B는 바이트를 나타내고, I는 int를 나타내고, J는 긴 등을 나타냅니다. 그런 다음 다음과 같은 로컬 메소드는 (ljava/lang/object; ii) v로 기록됩니다.
공개 정적 네이티브 void 테스트 (Object O, Int I, int I2);
위의 해당 방법은 JVM에 등록됩니다. 로컬 메소드를 호출하기 위해 실행되면 로컬 데이터 유형은 int-> jint 및 object-> jobject와 같은 유형 맵에 따라 변환됩니다. 실제로 Int와 Jint는 C ++에서 동일하며 Typedef를 사용하여 다른 이름을 정의합니다. Jobject는 포인터입니다. 실행 엔진은 Java 레이어 로직을 실행할 때 객체 객체를 생성합니다. JVM 계층에 특별한 데이터 구조가 있습니다. 여기서 Jobject는이 구조에 대한 포인터입니다. 사용해야 할 경우 JVM 계층의 데이터 구조로 캐스트 된 다음 작동 할 수 있습니다. 또한, OOP는 JVM에서 객체 포인터를 나타내는 데 사용됩니다.
| 자바 유형 | 기본 유형 | 값 |
|---|---|---|
| 부울 | Jboolean | 참 또는 거짓 |
| 바이트 | JBYTE | -128 ~ 127 |
| 짧은 | Jshort | -pow (2,15) ~ pow (2,15) -1 |
| int | Jint | -pow (2,31) ~ pow (2,31) -1 |
| 긴 | Jlong | -pow (2,63) ~ pow (2,63) -1 |
| 뜨다 | jfloat | IEEE754 표준 단일-차량 부동 소수점 번호 |
| 더블 | jdouble | IEEE754 표준 이중 정밀 부동 부동물 지점 번호 |
| 숯 | JCHAR | 16 비트 서명되지 않은 유니 코드 문자 |
기본 유형 매핑 외에도 Java 레이어의 다른 객체 유형은 기준 유형이므로 로컬 메소드는 작업 유형에 해당합니다. 또한 다음과 같이 JSTRING, JCLASS 등과 같은 일반적으로 사용되는 일부 서브 클래스를 도출합니다.
class _jobject {}; class _jclass : public _jobject {}; class _jthrowable : public _jobject {}; class _jString : public _jobject {}; class _jrray : public _jobject {}; class _jbooleanarray : public _jarray}; _jarray {}; class _jchararray : public _jarray {}; class _jshortarray : public _jarray {}; class _jintarray : public _jarray {}; class _jlongarray : public _jarray {}; class _JArray : _jarray _; : public _jarray {}; class _jobjectArray : public _jarray {};_jobject 클래스가 빈 클래스 인 _jobject 클래스가 정의되며 다른 클래스에는 _jclass _jthrowable _jString _jarray가 모두 _jobject 클래스에서 상속됩니다. 또한 배열 유형은 각각 기본 유형 배열 및 기준 유형 배열에 해당하는 9 개의 서브 클래스를 도출합니다.
클래스를 정의한 후 포인터 별칭을 정의하십시오. 다음은 로컬 방법의 유형입니다. 또한 C ++ 정의입니다. C 컴파일러 인 경우 struct를 사용하여 클래스가 아닌 _jobject를 정의합니다.
typedef _jobject *jobject; typedef _jclass *jclass; typedef _jthrowable *jthrowable; typedef _jstring *jstring; typedef _jarray *jrray; typedef _jbooleanarray *jbooleanarray; jbooleanarray; typedef _jbytearray *typedearray; *jcharray; typedef _jshortArray *jshortarray; typedef _jintarray *jintarray; typedef _jlongarray *jlongarray; typedef _jfloatarray *jfloatarray; typedef _jdoublearray *jdoublearray; typedef _jobbectarray;
위의 참조 유형은 빈 클래스로 정의됩니다. 여기서 우리는 C ++의 빈 클래스를 이해합니다. 일반적으로 다음 두 가지 방법으로 빈 클래스를 정의해야합니다.
클래스 빈 {} struct empty {}위의 정의 후에는 빈 클래스의 크기는 1이지만 아무것도 없다면 빈 클래스의 사용은 무엇입니까? 실제로, 다른 물체를 구별하는 데 사용될 수 있습니다. 빈 클래스로 정의 된 다른 개체마다 주소가 다릅니다. 새로운 것을 사용하여 작동하는 객체에는 다른 포인터도 있습니다. 또한 빈 클래스는 다른 범주를 구별 할 수 있습니다.
그렇다면이 유형의 매핑을 어떻게 사용합니까? 실제로는 매우 간단합니다. 대답은 포인터를 변환하는 것입니다. 앞에서 언급했듯이 Java 계층의 객체는 JVM의 특정 데이터 구조를 가지고 있습니다. 즉, OOP를 사용하여 객체 포인터를 나타냅니다. 그런 다음 작업을 다음과 같이 변환 할 수 있습니다. 여기서 손잡이는 작업 유형입니다.
OOP 결과 = *reinterPret_cast <OOP *> (핸들);
OOP로 변환 한 후 추가 처리하는 것이 매우 편리합니다. 예를 들어, 클래스 관련 메타 데이터를 얻으려면 klass를 사용하여 얻을 수 있습니다.
위에서, Java 계층에 의해 정의 된 유형은 로컬 방법에 해당 데이터 유형을 갖는다. 또한 Java 계층 소스 코드는 바이트 코드로 컴파일되며 로컬 메소드 매개 변수에 해당하는 유형을 저장합니다. JVM을 실행할 때 로컬 메소드에 해당하는 유형은 다른 유형에 따라 변환 될 수 있습니다. 로컬 메소드로 정의 된 유형은 모두 빈 클래스입니다. 주요 함수는 물체를 바인딩하고 객체 유형을 구별하는 것입니다. 필요한 경우 포인터 변환을 통해 객체 또는 클래스 메타 데이터에 액세스 할 수 있습니다.