<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 反射 ### 先看一個知乎回答   首先看一個在知乎上的優秀回答吧:   反射是什么呢?當我們的程序在運行時,需要動態的加載一些類這些類可能之前用不到所以不用加載到 JVM,而是在運行時根據需要才加載,這樣的好處對于服務器來說不言而喻。   舉個例子我們的項目底層有時是用 mysql,有時用 oracle,需要動態地根據實際情況加載驅動類,這個時候反射就有用了,假設 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection 這兩個類我們要用,這時候我們的程序就寫得比較動態化,通過 Class tc = Class.forName("com.java.dbtest.TestConnection"); 通過類的全類名讓 JVM 在服務器中找到并加載這個類,而如果是 Oracle 則傳入的參數就變成另一個了。這時候就可以看到反射的好處了,這個動態性就體現出 Java 的特性了!   舉多個例子,大家如果接觸過 spring,會發現當你配置各種各樣的 bean 時,是以配置文件的形式配置的,你需要用到哪些 bean 就配哪些,spring 容器就會根據你的需求去動態加載,你的程序就能健壯地運行。 ### [](https://github.com/frank-lam/fullstack-tutorial/blob/master/notes/JavaArchitecture/01-Java%E5%9F%BA%E7%A1%80.md#什么是反射)什么是反射   反射 (Reflection) 是 Java 程序開發語言的特征之一,它允許運行中的 Java 程序獲取自身的信息,并且可以操作類或對象的內部屬性。通過 Class 獲取 class 信息稱之為反射(Reflection)   簡而言之,通過反射,我們可以在運行時獲得程序或程序集中每一個類型的成員和成員的信息。   程序中一般的對象的類型都是在編譯期就確定下來的,而 Java 反射機制可以動態地創建對象并調用其屬性,這樣的對象的類型在編譯期是未知的。所以我們可以通過反射機制直接創建對象,即使這個對象的類型在編譯期是未知的。   反射的核心是 JVM 在運行時才動態加載類或調用方法/訪問屬性,它不需要事先(寫代碼的時候或編譯期)知道運行對象是誰。   Java 反射框架主要提供以下功能:   1. 在運行時判斷任意一個對象所屬的類   2. 在運行時構造任意一個類的對象   3. 在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調用 private 方法)   4. 在運行時調用任意一個對象的方法   **重點**:是運行時而不是編譯時 ### [](https://github.com/frank-lam/fullstack-tutorial/blob/master/notes/JavaArchitecture/01-Java%E5%9F%BA%E7%A1%80.md#主要用途)主要用途   很多人都認為反射在實際的 Java 開發應用中并不廣泛,其實不然。 當我們在使用 IDE (如Eclipse,IDEA)時,當我們輸入一個對象或類并想調用它的屬性或方法時,一按點號,編譯器就會自動列出它的屬性或方法,這里就會用到反射。   **反射最重要的用途就是開發各種通用框架**   很多框架(比如 Spring )都是配置化的(比如通過 XML 文件配置 JavaBean,Action 之類的),為了保證框架的通用性,它們可能需要根據配置文件加載不同的對象或類,調用不同的方法,這個時候就必須用到反射——運行時動態加載需要加載的對象。   對與框架開發人員來說,反射雖小但作用非常大,它是各種容器實現的核心。而對于一般的開發者來說,不深入框架開發則用反射用的就會少一點,不過了解一下框架的底層機制有助于豐富自己的編程思想,也是很有益的。 ### [](https://github.com/frank-lam/fullstack-tutorial/blob/master/notes/JavaArchitecture/01-Java%E5%9F%BA%E7%A1%80.md#獲得class對象)獲得Class對象 1. 調用運行時類本身的`.class`屬性 ~~~java Class clazz1 = Person.class; System.out.println(clazz1.getName()); ~~~ 2. 通過運行時類的對象獲取`getClass();` ~~~java Person p = new Person(); Class clazz3 = p.getClass(); System.out.println(clazz3.getName()); ~~~ 3. 使用 Class 類的`forName`靜態方法 ~~~java public static Class<?> forName(String className) // 在JDBC開發中常用此方法加載數據庫驅動: Class.forName(driver); ~~~ 4. (了解)通過類的加載器 ClassLoader ~~~java ClassLoader classLoader = this.getClass().getClassLoader(); Class clazz5 = classLoader.loadClass(className); System.out.println(clazz5.getName()); ~~~ 參考資料: * [深入解析Java反射(1) - 基礎 | 「浮生若夢」 - sczyh30's blog](https://www.sczyh30.com/posts/Java/java-reflection-1/#%E4%B8%80%E3%80%81%E5%9B%9E%E9%A1%BE%EF%BC%9A%E4%BB%80%E4%B9%88%E6%98%AF%E5%8F%8D%E5%B0%84%EF%BC%9F) * [學習java應該如何理解反射? - 知乎](https://www.zhihu.com/question/24304289/answer/147529485)
                  <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>

                              哎呀哎呀视频在线观看