最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

大概的流程

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

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

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

基礎(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位不帶符號(hào),Unicode字符

引用類型映射

除了基礎(chǔ)的類型映射外,Java 層其他對(duì)象類型為引用類型,那么本地方法對(duì)應(yīng)的是 jobject 類型,另外,它還會(huì)派生出經(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個(gè)子類,分別對(duì)應(yīng)基礎(chǔ)類型數(shù)組和引用類型數(shù)組。

前面定義完類后再定義指針別名,這里的就是本地方法的類型了。另外,這些都是 C++ 的定義,如果是 C 編譯器則會(huì)使用 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++的空類,通常我們要定義一個(gè)空類可以如下兩種方式,

class Empty{}
struct Empty{}

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

指針轉(zhuǎn)換

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

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

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

總結(jié)

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

相關(guān)文章

  • idea 設(shè)置支持ES6語法的操作

    idea 設(shè)置支持ES6語法的操作

    這篇文章主要介紹了idea設(shè)置支持ES6語法的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例

    Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例

    這篇文章主要介紹了Java使用PreparedStatement接口及ResultSet結(jié)果集的方法,結(jié)合實(shí)例形式分析了PreparedStatement接口及ResultSet結(jié)果集的相關(guān)使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限的示例代碼

    Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限的示例代碼

    在我們?nèi)粘i_發(fā)過程中,通常會(huì)涉及到數(shù)據(jù)權(quán)限問題,本文主要介紹了Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringMVC @RequestBody屬性名大寫字母注入失敗的解決

    SpringMVC @RequestBody屬性名大寫字母注入失敗的解決

    這篇文章主要介紹了SpringMVC @RequestBody屬性名大寫字母注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring boot跨域設(shè)置實(shí)例詳解

    Spring boot跨域設(shè)置實(shí)例詳解

    這篇文章主要介紹了Spring boot跨域設(shè)置實(shí)例詳解,簡(jiǎn)單介紹了跨域的定義,原因,使用場(chǎng)景及解決方案,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Spring Data Jpa 自動(dòng)生成表結(jié)構(gòu)的方法示例

    Spring Data Jpa 自動(dòng)生成表結(jié)構(gòu)的方法示例

    這篇文章主要介紹了Spring Data Jpa 自動(dòng)生成表結(jié)構(gòu)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java通過匿名類來實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)

    Java通過匿名類來實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)

    這篇文章主要介紹了Java通過匿名類來實(shí)現(xiàn)回調(diào)函數(shù)的例子,回調(diào)函數(shù)就是一種函數(shù)簽名(若干個(gè)輸入?yún)?shù)、一個(gè)輸出參數(shù))的規(guī)范,java雖不存在函數(shù)聲明,但是java可以用接口來強(qiáng)制規(guī)范。具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • Java源碼解析之詳解ImmutableMap

    Java源碼解析之詳解ImmutableMap

    今天給大家?guī)淼氖顷P(guān)于Java源碼的相關(guān)知識(shí),文章圍繞著Java ImmutableMap展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java基礎(chǔ)之簡(jiǎn)單的圖片處理

    Java基礎(chǔ)之簡(jiǎn)單的圖片處理

    這篇文章主要介紹了Java基礎(chǔ)之簡(jiǎn)單的圖片處理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java8異步調(diào)用如何使用才是最好的方式

    java8異步調(diào)用如何使用才是最好的方式

    異步調(diào)用主要用于當(dāng)前程序的執(zhí)行不用等待調(diào)用方法執(zhí)行結(jié)束就可以繼續(xù)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于java8異步調(diào)用如何使用才是最好的方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01

最新評(píng)論

怀仁县| 菏泽市| 天柱县| 苏尼特左旗| 巴彦淖尔市| 闽侯县| 靖安县| 呼伦贝尔市| 乌恰县| 四川省| 鹿泉市| 郑州市| 石泉县| 晴隆县| 禹城市| 南溪县| 宜兰市| 固始县| 晴隆县| 徐水县| 瑞安市| 堆龙德庆县| 福州市| 淄博市| 南华县| 平定县| 临安市| 阳东县| 岚皋县| 古交市| 抚顺市| 盐山县| 海淀区| 井陉县| 吐鲁番市| 含山县| 咸宁市| 屯昌县| 大姚县| 汕尾市| 兴文县|