国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領取全套視頻
            千鋒教育

            關注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術干貨  > 什么是反射?及其作用

            什么是反射?及其作用

            來源:千鋒教育
            發(fā)布人:qyf
            時間: 2022-06-07 15:14:00 1654586040

            java培訓

              反射 (Reflection) 是 Java 的特征之一,它允許運行中的 Java 程序獲取自身的信息,并且可以操作類或對象的內部屬性。

              簡而言之,通過反射,我們可以在運行時獲得程序或程序集中每一個類型的成員和成員的信息。程序中一般的對象的類型都是在編譯期就確定下來的,而 Java 反射機制可以動態(tài)地創(chuàng)建對象并調用其屬性,這樣的對象的類型在編譯期是未知的。所以我們可以通過反射機制直接創(chuàng)建對象,即使這個對象的類型在編譯期是未知的。

              反射的核心:是 JVM 在運行時才動態(tài)加載類或調用方法/訪問屬性,它不需要事先(寫代碼的時候或編譯期)知道運行對象是誰。

              Java 反射主要提供以下功能:

              在運行時判斷任意一個對象所屬的類;

              在運行時構造任意一個類的對象;

              在運行時判斷任意一個類所具有的成員變量和方法(反射甚至可以調用private方法);

              在運行時調用任意一個對象的方法

              重點:是運行時而不是編譯時

              二、反射的主要用途

              很多人都認為反射在實際的 Java 開發(fā)應用中并不廣泛,其實不然。當我們在使用 IDE(如 Eclipse,IDEA)時,當我們輸入一個對象或類并想調用它的屬性或方法時,一按點號,編譯器就會自動列出它的屬性或方法,這里就會用到反射。

              反射最重要的用途就是開發(fā)各種通用框架。很多框架(比如 Spring)都是配置化的(比如通過 XML 文件配置 Bean),為了保證框架的通用性,它們可能需要根據(jù)配置文件加載不同的對象或類,調用不同的方法,這個時候就必須用到反射,運行時動態(tài)加載需要加載的對象。

              舉一個例子,在運用 Struts 2 框架的開發(fā)中我們一般會在 struts.xml 里去配置 Action,比如:

            <action name="login"

                           class="org.ScZyhSoft.test.action.SimpleLoginAction"

                           method="execute">

                       <result>/shop/shop-index.jsp</result>

                       <result name="error">login.jsp</result>

                   </action>

              配置文件與 Action 建立了一種映射關系,當 View 層發(fā)出請求時,請求會被 StrutsPrepareAndExecuteFilter 攔截,然后 StrutsPrepareAndExecuteFilter 會去動態(tài)地創(chuàng)建 Action 實例。比如我們請求 login.action,那么 StrutsPrepareAndExecuteFilter就會去解析struts.xml文件,檢索action中name為login的Action,并根據(jù)class屬性創(chuàng)建SimpleLoginAction實例,并用invoke方法來調用execute方法,這個過程離不開反射。

              對與框架開發(fā)人員來說,反射雖小但作用非常大,它是各種容器實現(xiàn)的核心。而對于一般的開發(fā)者來說,不深入框架開發(fā)則用反射用的就會少一點,不過了解一下框架的底層機制有助于豐富自己的編程思想,也是很有益的。

              三、反射的基本運用

              上面我們提到了反射可以用于判斷任意對象所屬的類,獲得 Class 對象,構造任意一個對象以及調用一個對象。這里我們介紹一下基本反射功能的使用和實現(xiàn)(反射相關的類一般都在 java.lang.relfect 包里)。

              1、獲得 Class 對象

              方法有三種:

            (1) 使用 Class 類的 forName 靜態(tài)方法:

            1

            2

            3

            4

            5

            6

            7

             public static Class<?> forName(String className)

            ```

            比如在 JDBC 開發(fā)中常用此方法加載數(shù)據(jù)庫驅動:

            ```java

             Class.forName(driver);

            (2)直接獲取某一個對象的 class,比如:

            1

            2

            Class<?> klass = int.class;

            Class<?> classInt = Integer.TYPE;

            (3)調用某個對象的 getClass() 方法,比如:

            1

            2

            StringBuilder str = new StringBuilder("123");

            Class<?> klass = str.getClass();

              2、判斷是否為某個類的實例

              一般地,我們用 instanceof 關鍵字來判斷是否為某個類的實例。同時我們也可以借助反射中 Class 對象的 isInstance() 方法來判斷是否為某個類的實例,它是一個 native 方法:

            1

            public native boolean isInstance(Object obj);

              3、創(chuàng)建實例

              通過反射來生成對象主要有兩種方式。

              使用Class對象的newInstance()方法來創(chuàng)建Class對象對應類的實例。

            1

            2

            Class<?> c = String.class;

            Object str = c.newInstance();

              先通過Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創(chuàng)建實例。這種方法可以用指定的構造器構造類的實例。

            1

            2

            3

            4

            5

            6

            7

            //獲取String所對應的Class對象

            Class<?> c = String.class;

            //獲取String類帶一個String參數(shù)的構造器

            Constructor constructor = c.getConstructor(String.class);

            //根據(jù)構造器創(chuàng)建實例

            Object obj = constructor.newInstance("23333");

            System.out.println(obj);

              4、獲取方法

              獲取某個Class對象的方法集合,主要有以下幾個方法:

              getDeclaredMethods 方法返回類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。

            1

            public Method[] getDeclaredMethods() throws SecurityException

            getMethods 方法返回某個類的所有公用(public)方法,包括其繼承類的公用方法。

            1

            public Method[] getMethods() throws SecurityException

            getMethod 方法返回一個特定的方法,其中第一個參數(shù)為方法名稱,后面的參數(shù)為方法的參數(shù)對應Class的對象。

            1

            public Method getMethod(String name, Class<?>... parameterTypes)

              5、獲取構造器信息

              獲取類構造器的用法與上述獲取方法的用法類似。主要是通過Class類的getConstructor方法得到Constructor類的一個實例,而Constructor類有一個newInstance方法可以創(chuàng)建一個對象實例:

            1

            public T newInstance(Object ... initargs)

              此方法可以根據(jù)傳入的參數(shù)來調用對應的Constructor創(chuàng)建對象實例。

              6、獲取類的成員變量(字段)信息

              主要是這幾個方法,在此不再贅述:

              getFiled:訪問公有的成員變量

              getDeclaredField:所有已聲明的成員變量,但不能得到其父類的成員變量getFileds 和 getDeclaredFields 方法用法同上(參照 Method)。

              7、調用方法

              當我們從類中獲取了一個方法后,我們就可以用 invoke() 方法來調用這個方法。invoke 方法的原型為:

            1

            2

            3

            public Object invoke(Object obj, Object... args)

                    throws IllegalAccessException, IllegalArgumentException,

                       InvocationTargetException

              四、反射的一些注意事項

              由于反射會額外消耗一定的系統(tǒng)資源,因此如果不需要動態(tài)地創(chuàng)建一個對象,那么就不需要用反射。另外,反射調用方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全問題。

              更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業(yè)需求,更科學更嚴謹,每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。

            tags:
            聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
            10年以上業(yè)內強師集結,手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
            免費領取
            今日已有369人領取成功
            劉同學 138****2860 剛剛成功領取
            王同學 131****2015 剛剛成功領取
            張同學 133****4652 剛剛成功領取
            李同學 135****8607 剛剛成功領取
            楊同學 132****5667 剛剛成功領取
            岳同學 134****6652 剛剛成功領取
            梁同學 157****2950 剛剛成功領取
            劉同學 189****1015 剛剛成功領取
            張同學 155****4678 剛剛成功領取
            鄒同學 139****2907 剛剛成功領取
            董同學 138****2867 剛剛成功領取
            周同學 136****3602 剛剛成功領取
            相關推薦HOT