欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析本地方法映射Java層的數(shù)據(jù)類型

 更新時間:2018年03月16日 10:16:33   作者:github  
這篇文章給大家介紹了本地方法映射Java層的數(shù)據(jù)類型,包括基礎(chǔ)類型映射,引用類型映射等等,對java層數(shù)據(jù)類型映射相關(guān)知識,感興趣的朋友跟隨腳本之家小編一起看看吧

前言

Java 語言上定義了不同的數(shù)據(jù)類型,比如有基礎(chǔ)類型int、double等等,還有所有類的父類Object等,這些都是 Java 層面的類型,而使用本地方法的處理過程需要有它們對應(yīng)的類型。

大概的流程

Java 層編寫的本地方法,被編譯器編譯為字節(jié)碼,字節(jié)碼將按照規(guī)范將不同類型的參數(shù)給記錄到 class 文件中,比如 B 表示 byte、I 表示 int、J 表示 long 等等。那么一個如下的本地方法,被記錄為(Ljava/lang/Object;II)V。

public static native void test(Object o, int i, int i2);

上述對應(yīng)的方法被注冊JVM中,當(dāng)執(zhí)行到調(diào)用本地方法時則會按照類型映射轉(zhuǎn)換成本地?cái)?shù)據(jù)類型,比如int->jint和Object->jobject。這里其實(shí) int 和 jint 在 C++ 中是一樣的,只是用 typedef 定義了另外一個名稱而已,而 jobject 是一個指針,執(zhí)行引擎在執(zhí)行 Java 層邏輯時生成了 Object 對象,它在 JVM 層有專門的數(shù)據(jù)結(jié)構(gòu),這里的 jobject 就是指向這個結(jié)構(gòu)的指針,在需要使用時可以強(qiáng)制轉(zhuǎn)換成 JVM 層的數(shù)據(jù)結(jié)構(gòu),然后即可對其進(jìn)行操作。另外,JVM 中用 oop 來表示對象指針。

基礎(chǔ)類型映射

Java Type Native Type value
boolean jboolean true或false
byte jbyte -128~127
short 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
float jfloat IEEE754標(biāo)準(zhǔn)單精度浮點(diǎn)數(shù)
double jdouble IEEE754標(biāo)準(zhǔn)雙精度浮點(diǎn)數(shù)
char jchar 16位不帶符號,Unicode字符

引用類型映射

除了基礎(chǔ)的類型映射外,Java 層其他對象類型為引用類型,那么本地方法對應(yīng)的是 jobject 類型,另外,它還會派生出經(jīng)常用的一些子類,比如 jstring、jclass 等等,具體如下,

class _jobject {};
class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
class _jbooleanArray : public _jarray {};
class _jbyteArray : public _jarray {};
class _jcharArray : public _jarray {};
class _jshortArray : public _jarray {};
class _jintArray : public _jarray {};
class _jlongArray : public _jarray {};
class _jfloatArray : public _jarray {};
class _jdoubleArray : public _jarray {};
class _jobjectArray : public _jarray {};

可以看到定義了_jobject類,該類為空類,而其他的類包括_jclass _jthrowable _jstring _jarray都是繼承_jobject類。此外,數(shù)組類型還派生出了9個子類,分別對應(yīng)基礎(chǔ)類型數(shù)組和引用類型數(shù)組。

前面定義完類后再定義指針別名,這里的就是本地方法的類型了。另外,這些都是 C++ 的定義,如果是 C 編譯器則會使用 struct 來定義 _jobject,而非 class。

typedef _jobject *jobject;
typedef _jclass *jclass;
typedef _jthrowable *jthrowable;
typedef _jstring *jstring;
typedef _jarray *jarray;
typedef _jbooleanArray *jbooleanArray;
typedef _jbyteArray *jbyteArray;
typedef _jcharArray *jcharArray;
typedef _jshortArray *jshortArray;
typedef _jintArray *jintArray;
typedef _jlongArray *jlongArray;
typedef _jfloatArray *jfloatArray;
typedef _jdoubleArray *jdoubleArray;
typedef _jobjectArray *jobjectArray;

CPP的空類

上面的引用類型定義為空類,這里了解下C++的空類,通常我們要定義一個空類可以如下兩種方式,

class Empty{}
struct Empty{}

經(jīng)過上述定義后的空類,它的大小為1,但是一個空類啥都沒有的話它有什么用呢?其實(shí)它可以用來區(qū)分不同的對象,空類定義的不同對象擁有不同的地址,使用new操作出來的對象也有不同的指針,而且空類也能區(qū)分不同的類別。

指針轉(zhuǎn)換

所以有了這些類型映射后我們是怎么聯(lián)系起來使用的呢?其實(shí)很簡單,答案就是進(jìn)行指針轉(zhuǎn)換,前面提到過 Java 層的對象在 JVM 中是有一定的數(shù)據(jù)結(jié)構(gòu)的,即用 oop 來表示對象指針,那么 jobject 可以作如下轉(zhuǎn)換,其中 handle 即為 jobject 類型。

oop result = *reinterpret_cast<oop*>(handle);

轉(zhuǎn)換成 oop 后要進(jìn)一步處理就很方便了,比如想要獲取一些類相關(guān)的元數(shù)據(jù)時可以使用其中的 klass 來獲取。

總結(jié)

以上,Java 層定義的類型在本地方法有著與之相對應(yīng)的數(shù)據(jù)類型,而且 Java 層源碼被編譯為字節(jié)碼后保存了本地方法參數(shù)對應(yīng)的類型,JVM 執(zhí)行時可以根據(jù)不同的類型轉(zhuǎn)換成本地方法對應(yīng)的類型,而本地方法定義的類型都為空類,主要作用是用來綁定對象,并且可以區(qū)分對象類型,在必要時刻通過指針轉(zhuǎn)換即可訪問對象或類元數(shù)據(jù)。

相關(guān)文章

  • Java面向?qū)ο笾橄箢?接口的那些事

    Java面向?qū)ο笾橄箢?接口的那些事

    這篇文章主要介紹了Java面向?qū)ο蠡A(chǔ):抽象類和接口,文中代碼可以幫助各位更好的理解學(xué)習(xí),有需求的小伙伴可以參考下,希望能夠給你帶來幫助
    2021-08-08
  • java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息詳解

    java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息詳解

    根據(jù)IP自動獲取當(dāng)?shù)氐奶鞖忸A(yù)報(bào)信息這個功能大家應(yīng)該都遇到過,天氣預(yù)報(bào)信息用途非常廣泛,篇文章主要給大家介紹了關(guān)于java如何根據(jù)IP獲取當(dāng)前區(qū)域天氣信息的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 解決idea check out 切換分支時找不到需要的分支問題

    解決idea check out 切換分支時找不到需要的分支問題

    這篇文章主要介紹了解決idea check out 切換分支時找不到需要的分支問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java實(shí)現(xiàn)簡單GUI登錄和注冊界面

    Java實(shí)現(xiàn)簡單GUI登錄和注冊界面

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單GUI登錄和注冊界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 關(guān)于工廠方法模式的Java實(shí)現(xiàn)

    關(guān)于工廠方法模式的Java實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于工廠方法模式的Java實(shí)現(xiàn)講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JAVA項(xiàng)目如何打包部署到Linux服務(wù)器上

    JAVA項(xiàng)目如何打包部署到Linux服務(wù)器上

    本文詳細(xì)介紹了在服務(wù)器上部署環(huán)境包括JDK、MySQL、Tomcat的設(shè)置,以及使用Idea-Maven-SpringBoot進(jìn)行jar包打包部署的流程,內(nèi)容涵蓋了MySQL配置注意事項(xiàng)、pom.xml配置、打包命令等關(guān)鍵步驟,同時,也提供了如何將jar包上傳到Linux服務(wù)器并運(yùn)行的具體方法
    2024-10-10
  • Java阻塞延遲隊(duì)列DelayQueue原理及使用詳解

    Java阻塞延遲隊(duì)列DelayQueue原理及使用詳解

    這篇文章主要介紹了Java阻塞延遲隊(duì)列DelayQueue原理及使用詳解,阻塞隊(duì)列是一個支持兩個附加操作的隊(duì)列,這兩個附加的操作是:在隊(duì)列為空時,從隊(duì)列中獲取元素的消費(fèi)者線程會一直等待直到隊(duì)列變?yōu)榉强?需要的朋友可以參考下
    2023-12-12
  • 詳解如何在springcloud分布式系統(tǒng)中實(shí)現(xiàn)分布式鎖

    詳解如何在springcloud分布式系統(tǒng)中實(shí)現(xiàn)分布式鎖

    最近在看分布式鎖的資料,本文就介紹一下利用springcloud結(jié)合redis實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java實(shí)現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片)

    Java實(shí)現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片)

    這篇文章主要介紹了Java實(shí)現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java阻塞隊(duì)列中的BlockingQueue接口詳解

    Java阻塞隊(duì)列中的BlockingQueue接口詳解

    這篇文章主要介紹了Java阻塞隊(duì)列中的BlockingQueue接口詳解,對于Queue而言,BlockingQueue是主要的線程安全的版本,具有阻塞功能,可以允許添加、刪除元素被阻塞,直到成功為止,BlockingQueue相對于Queue而言增加了兩個方法put、take元素,需要的朋友可以參考下
    2023-09-09

最新評論