<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ?# 第四章第一節--反射 標簽(空格分隔): 廖雪峰 --- ## class類 Java除了基本數據類型之外其他都是class(包括interface) - String - Object - Runnable - Execption - ... class/interface的數據類型是Class(注意這里區分大小寫) 每加載一個class,JVM就會為其創建一個Class類型的實例,并關聯起來. 當JVM加載String類的時候,先讀取String.class文件,再為String創建一個Class實例 `Class cls = new Class(String);(僅用來演示過程,Class為private,自己代碼是無法創建的)` JVM持有的每一個Class實例都指向一個數據類型(class或者interface) ![Class實例對比](http://p0b921qfc.bkt.clouddn.com/18-5-17/5715564.jpg) 一個Class實例包含了該class的完整信息. ![Class的完整信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/47214925.jpg) **所以說:** 1. JVM為每個加載的class創建對應的Class實例,并在實例中保存該class的所有信息. 2. 如果獲取了某個Class實例,則可以獲取到該實例對應的class的所有信息. 3. 通過Class實例獲取class信息的方法就叫做**反射**. 如何獲取一個class的Class實例呢? 1. Type.class `String.class` 2. getClass() `String s = "hello"; Class cls = s.getClass();` 3. Class.forName() `Class cls = Class.forName("java.lang.String");` ![三種調用方式](http://p0b921qfc.bkt.clouddn.com/18-5-17/46471517.jpg) 注意: Class實例在JVM中是唯一的 可以用`==`比較兩個Class的實例. ![三種方式比較相同](http://p0b921qfc.bkt.clouddn.com/18-5-17/21165063.jpg) - Class實例和instanceof的差別.(用的比較多) - `==`只能做精確類型的對比,不能做子類的判斷. - instanceof:不但匹配當前類型,還匹配當前類型的子類型. ![對比結果](http://p0b921qfc.bkt.clouddn.com/18-5-17/12148084.jpg) ## 反射 反射的目的:當獲取某個Object實例時,我們可以獲取該Object的class的所有信息. 從Class實例中獲取class信息: - getName() 獲取類名 - getSimpleName() 獲取簡寫類型 - getPackage() 包名. ![Class中獲取的基本信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/83464025.jpg) 從Class實例判斷class的類型. - isInterface() 是不是接口 - isEnum() 是不是枚舉類型. - isArray() 是不是數據類型. - isPrimitive() 是不是基本數據類型. ![判斷信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/46533131.jpg) 創建classs實例(自控制) 只能調用其public 沒有參數的構造方法. - newInstance() ![新建實例](http://p0b921qfc.bkt.clouddn.com/18-5-17/94670669.jpg) JVM的動態加載 利用其動態加載的特征可以在運行時候加載不同的實現類. ![動態加載的時候判斷](http://p0b921qfc.bkt.clouddn.com/18-5-17/95550557.jpg) ## 小節小結 - JVM為每一個加載的class創建對應的Class實例來保存class的所有信息. - 獲取一個clas對應的Class之后,就可以獲取class的所有信息. - 通過Class實例去獲取class信息的方法就叫做反色(Reflection) - JVM總是動態加載class的,可以在運行的時候根據條件判斷加載class.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看