日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础18(类加载、反射和动态代理)

發布時間:2024/9/30 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础18(类加载、反射和动态代理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 1 類是如何從.class文件到JVM可以使用
        • 1.1 JVM
        • 1.2 JVM加載類
          • 1.2.1 JVM什么時候加載某個類
          • 1.2.2 類加載器加載類
          • 1.2.3 連接
          • 1.2.4 類的初始化
      • 2. 反射
        • 2.1 獲得類的Class對象
        • 2.2 從Class對象中獲取信息

1 類是如何從.class文件到JVM可以使用

1.1 JVM

當我們啟動某個Java程序時,將會在系統中啟動一條Java虛擬機進程,不管該Java程序有多復雜,它們都處于這個Java虛擬機中。

JVM進程終止的情況:

  • 程序正常結束。
  • 程序運行到System.exit()或者Runtime.getRuntime().exit()代碼結束。
  • 程序運行過程中遇到未被捕獲的異常或者錯誤,程序結束。
  • JVM運行的平臺強制結束了JVM進程。比如linux下用kill命令強制結束某個進程。

1.2 JVM加載類

當JVM主動使用某個類,且該類還未被加載到內存中,系統就會通過加載、連接、初始化三步來把該類加載到內存。

  • 加載:將類的.class文件讀入到內存,并為其創建一個java.lang.Class對象。
  • 連接:把類的二進制數據合并到JRE中。該階段又分為驗證、準備、解析。
  • 初始化:對類的靜態屬性進行初始化。
  • 1.2.1 JVM什么時候加載某個類

    當程序通過以下六種方式來使用某個類或者接口時,JVM主動加載該類或者接口:

  • 創建類的對象。有通過new操作符來創建對象,通過反射創建對象,通過反序列化創建對象。
  • 調用某個類的靜態方法
  • 調用某個類的靜態屬性,或者為該屬性賦值。
  • 通過反射方式強制創建某個類或者接口對應的java.lang.Class對象。比如前面的Class.forName("com.mysql.jdbc.Driver"),如果JVM還未加載Driver類,這段代碼就會將該類初始化,并返回Driver類對應的java.lang.Class對象。
  • 初始化某個類的子類。當JVM需要初始化某個類的,其所有的父類都會被初始化。
  • 直接使用java.exe來運行某個主類,JVM會初始化該主類。
  • 1.2.2 類加載器加載類

    類的加載由類加載器完成。

    類加載器加載二進制數據來源:

    • 本地文件系統來加載class文件
    • 從jar包中加載class文件。通常是我們使用非jdk提供的類,比如使用JDBC要用到的mysql驅動。
    • 通過網絡加載(我用的比較少)
    • 把一個Java源文件動態編譯、并加載

    類加載器加載類的時機:看JVM的設置

    1.2.3 連接

    連接負責將類的二進制數據合并到jre中。整個過程分為三步:

  • 驗證:檢測被加載的類是否有正確的內部結構,并且和其他類協調一致。
  • 準備:負責為類的靜態屬性分配內存,并且設置默認初始值。
  • 解析:將類的二進制數據中的符號引用替換為直接引用。(這里不太懂)
  • 1.2.4 類的初始化

    2. 反射

    2.1 獲得類的Class對象

    每個類被加載后,系統會為該類生成一個對應的Class對象。獲取Class對象的方式有:

  • 使用Class的forName()靜態方法。參數為類的全限定類名的字符串。
  • 調用某個類的class屬性。如Person.class的值就是Person對應的Class對象。
  • 調用對象的getClass()方法。
  • 2.2 從Class對象中獲取信息

    獲取構造器:

  • Connstructor<T> getConstructor(Class<?>... parameterTypes):
  • 總結

    以上是生活随笔為你收集整理的Java基础18(类加载、反射和动态代理)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。