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

利用Java編寫一個Java虛擬機

 更新時間:2023年07月30日 08:54:48   作者:Haidnor  
這篇文章主要為大家詳細介紹了如何使用 Java17 編寫的 Java 虛擬機,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解下

github 項目鏈接

https://github.com/FranzHaidnor/haidnorJVM

haidnorJVM

使用 Java17 編寫的 Java 虛擬機

意義

  • 紙上得來終覺淺,絕知此事要躬行。只學習 JVM 機制和理論,很多時候任然覺得缺乏那種大徹大悟之感
  • 使用簡單的方式實現(xiàn) JVM,用于學習理解 JVM 運行原理

主要技術(shù)選型

實現(xiàn)功能

  • 實現(xiàn)了 99% 的 JVM 字節(jié)碼指令。參照 JVM 字節(jié)碼規(guī)范實現(xiàn) The Java Virtual Machine Instruction Set
  • 支持算數(shù)運算符 (+,-,*,^,%,++,--)
  • 支持關(guān)系運算符 (==,!=,>,<,>=,<=)
  • 支持位運算符 (&,|,^,~,<<,>>,>>>)
  • 支持賦值運算符 (=,+=,-=,*=,%=,<<=,>>=,&=,^=,|=)
  • 支持 instanceof 運算符
  • 支持循環(huán)結(jié)構(gòu)代碼 (while,do...while,for,foreach)
  • 支持條件結(jié)構(gòu)代碼 (if,if...else,if...else if)
  • 支出創(chuàng)建自定義類
  • 支持創(chuàng)建對象、訪問對象
  • 支持抽象類
  • 支持多態(tài)繼承、接口
  • 支持訪問靜態(tài)方法
  • 支持訪問對象方法
  • 支持 JDK 中自帶的 Java 類
  • 支持反射
  • 支持異常
  • 枚舉 (開發(fā)中...)
  • switch 語法 (開發(fā)中...)
  • lambda 表達式 (開發(fā)中...)

局限性

不支持多線程

不支持多維數(shù)組

暫無雙親委派機制實現(xiàn)

無垃圾收集器實現(xiàn)。垃圾回收依靠宿主 JVM

快速體驗

你需要準備什么

  • 集成開發(fā)環(huán)境 (IDE)。你可以選擇包括 IntelliJ IDEA、Visual Studio Code 或 Eclipse 等等
  • JDK 17。并配置 JAVA_HOME
  • JDK 8。haidnorJVM 的主要目標是運行 Java8 本版的字節(jié)碼文件。(但 haidnorJVM 沒有強制要求字節(jié)碼文件是 Java8 版本)
  • Maven

配置 haidnorJVM

配置日志輸出級別

在 resources\simplelogger.properties 文件中修改日志輸出級別,一般使用 debuginfo

  • 配置 info 級別將不會看到任何 haidnorJVM 內(nèi)部運行信息
  • 配置 debug 級別下運行將會非常友好的輸出 JVM 正在執(zhí)行的棧信息
public class Demo5 {
    public static void main(String[] args) {
        String str = method1("hello world");
        method1(str);
    }
    public static String method1(String s) {
        return method2(s);
    }
    public static String method2(String s) {
        return method3(s);
    }
    public static String method3(String s) {
        System.out.println(s);
        return "你好 世界";
    }
}

每一個  結(jié)構(gòu)圖形,都表示一個 JVM 線程棧中的棧幀

配置 rt.jar 路徑

修改 haidnorJVM.properties 文件中的內(nèi)容。配置 rt.jar 的絕對路徑,例如rt.jar=D:/Program Files/Java/jdk1.8.0_361/jre/lib/rt.jar

運行單元測試用例

在 IDE 中打開項目中 test 目錄下的 haidnor.jvm.test.TestJVM.java 文件。 這是 haidnorJVM 的主要測試類, 里面的測試方法可以解析加載運行 .class 字節(jié)碼文件。

public class TestJVM {
   /**
    *  haidnorJVM 會加載 HelloWorld.java 在 target 目錄下的編譯后的字節(jié)碼文件,然后運行其中的 `main(String[] args)` 方法。
    *  你可以使用打斷點的方式看到 haidnorJVM 是如何解釋運行 Java 字節(jié)碼的。
    *  值得注意的是,這種方式編譯運行的字節(jié)碼文件是基于 java17 版本的。
    */
   @Test
   public void test() {
      runMainClass(HelloWorld.class);
   }
}

運行 .class 文件

  • 使用 maven 命令將 haidnorJVM 編譯打包,得到 haidnorJVM.jar 文件
  • 編寫一個簡單的程序,例如以下代碼
public class HelloWorld {
   public static void main(String[] args) {
     System.out.println("HelloWorld");
   }
}
  • 編譯代碼,得到 HelloWorld.class 文件 (推薦使用 JDK8 進行編譯)
  • 使用 haidnorJVM 運行程序。執(zhí)行命令 java -jar haidnorJVM.jar -class R:\HelloWorld.class。注意! 需要 class 文件的絕對路徑

運行 .jar 文件

  • 使用 maven 命令將 haidnorJVM 編譯打包,得到 haidnorJVM.jar 文件
  • 編寫一個 java 項目編譯打包成 .jar 文件,例如 demo.jar。要求 .jar 文件中的 META-INF/MANIFEST.MF 文件內(nèi)有 Main-Class 屬性 (含有 public static void main(String[] args) 方法的主類信息)
  • 使用 haidnorJVM 運行程序。執(zhí)行命令 java -jar haidnorJVM.jar -class R:\demo.jar。注意! 需要 jar 文件的絕對路徑

存在的問題

由于 haidnorJVM 目前運行 JDK 自帶的類是使用反射解決的,因此 haidnorJVM 使用 JDK17 運行部分 JDK 自帶的類時會存在一些問題,例如運行以下代碼將會拋出異常

public class Demo {
    public static void main(String[] args) {
        List<Integer> list = List.of(1, 2, 3, 4, 5);
        list.add(6);
    }
}
java.lang.reflect.InaccessibleObjectException: Unable to make public boolean java.util.ImmutableCollections$AbstractImmutableCollection.add(java.lang.Object) accessible: module java.base does not "opens java.util" to unnamed module @18769467
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)

它表示嘗試通過反射來訪問一個方法或字段,但該方法或字段的可訪問性限制導致無法訪問。

這個限制通常是由于 Java 模塊系統(tǒng)引起的。模塊系統(tǒng)允許將代碼劃分為獨立的模塊,并控制模塊之間的訪問權(quán)限。以上異常的原因是 module java.base does not "opens java.util" to unnamed module,也就是說 java.base 模塊沒有向未命名模塊開放 java.util 包

解決方法:啟動 haidnorJVM 時添加 JVM 參數(shù) --add-opens java.base/java.util=ALL-UNNAMED 繞過訪問性限制

以上就是利用Java編寫一個Java虛擬機的詳細內(nèi)容,更多關(guān)于Java虛擬機的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)文件批量重命名具體實例

    Java實現(xiàn)文件批量重命名具體實例

    這篇文章主要介紹了Java實現(xiàn)文件批量重命名具體實例,需要的朋友可以參考下
    2014-02-02
  • spring 自動裝配和aop的使用

    spring 自動裝配和aop的使用

    這篇文章主要介紹了spring 自動裝配和aop的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 使用springmvc臨時不使用視圖解析器的自動添加前后綴

    使用springmvc臨時不使用視圖解析器的自動添加前后綴

    這篇文章主要介紹了使用springmvc臨時不使用視圖解析器的自動添加前后綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java多種幻燈片切換特效(經(jīng)典)

    java多種幻燈片切換特效(經(jīng)典)

    功能說明: 代碼實現(xiàn)了多種幻燈片變換特效. 如:淡入淡出、緩慢覆蓋、旋轉(zhuǎn)覆蓋等10多種變換效果。
    2013-03-03
  • Java入門之繼承多態(tài)使用及說明

    Java入門之繼承多態(tài)使用及說明

    文章概述Java繼承與多態(tài)的核心概念,包括繼承的共性抽取、子類父類關(guān)系、super關(guān)鍵字的使用、構(gòu)造方法與代碼塊執(zhí)行順序,以及向上轉(zhuǎn)型、動態(tài)綁定和重寫機制,最后預告多態(tài)內(nèi)容并附練習題
    2025-09-09
  • Java使用itext5實現(xiàn)PDF表格文檔導出

    Java使用itext5實現(xiàn)PDF表格文檔導出

    這篇文章主要介紹了Java使用itext5實現(xiàn)PDF表格文檔導出,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • swing jtextArea滾動條和文字縮放效果

    swing jtextArea滾動條和文字縮放效果

    這篇文章主要為大家詳細介紹了swing jtextArea滾動條和文字縮放效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • mybatis插入后返回主鍵id的3種方式圖解

    mybatis插入后返回主鍵id的3種方式圖解

    這篇文章主要給大家介紹了關(guān)于mybatis插入后返回主鍵id的3種方式,很多時候,在向數(shù)據(jù)庫插入數(shù)據(jù)時,需要保留插入數(shù)據(jù)的,以便進行后續(xù)的操作或者將存入其他表作為外鍵,需要的朋友可以參考下
    2023-08-08
  • Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫

    Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫

    這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot實現(xiàn)token登錄的示例代碼

    SpringBoot實現(xiàn)token登錄的示例代碼

    在進行登錄驗證時,我們需要session或cookie會話進行驗證,當我們脫離瀏覽器用app等向服務(wù)端發(fā)請求就沒有session和cookie機制,這時我們就需要使用token令牌進行登錄驗證,本文就詳細的介紹一下,感興趣的可以了解一下
    2022-03-03

最新評論

清徐县| 佳木斯市| 象州县| 历史| 平山县| 若羌县| 拉萨市| 济南市| 邵武市| 韩城市| 井陉县| 东光县| 永安市| 白水县| 安乡县| 洛扎县| 洛川县| 东乡| 大渡口区| 墨玉县| 伊宁县| 河池市| 道孚县| 泸水县| 曲靖市| 晋宁县| 芜湖市| 浦东新区| 阳新县| 柘城县| 砀山县| 安吉县| 嫩江县| 肥乡县| 苗栗县| 基隆市| 咸阳市| 阿坝县| 奇台县| 长泰县| 稻城县|