麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

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

什么是反射?及其作用

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

java培訓

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

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

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

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

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

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

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

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

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

  二、反射的主要用途

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

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

  舉一個例子,在運用 Struts 2 框架的開發中我們一般會在 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 層發出請求時,請求會被 StrutsPrepareAndExecuteFilter 攔截,然后 StrutsPrepareAndExecuteFilter 會去動態地創建 Action 實例。比如我們請求 login.action,那么 StrutsPrepareAndExecuteFilter就會去解析struts.xml文件,檢索action中name為login的Action,并根據class屬性創建SimpleLoginAction實例,并用invoke方法來調用execute方法,這個過程離不開反射。

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

  三、反射的基本運用

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

  1、獲得 Class 對象

  方法有三種:

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

1

2

3

4

5

6

7

 public static Class<?> forName(String className)

```

比如在 JDBC 開發中常用此方法加載數據庫驅動:

```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、創建實例

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

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

1

2

Class<?> c = String.class;

Object str = c.newInstance();

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

1

2

3

4

5

6

7

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

Class<?> c = String.class;

//獲取String類帶一個String參數的構造器

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

//根據構造器創建實例

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 方法返回一個特定的方法,其中第一個參數為方法名稱,后面的參數為方法的參數對應Class的對象。

1

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

  5、獲取構造器信息

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

1

public T newInstance(Object ... initargs)

  此方法可以根據傳入的參數來調用對應的Constructor創建對象實例。

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

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

  getFiled:訪問公有的成員變量

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

  7、調用方法

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

1

2

3

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

        throws IllegalAccessException, IllegalArgumentException,

           InvocationTargetException

  四、反射的一些注意事項

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

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

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師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
主站蜘蛛池模板: 日韩免费三级电影| 尹人香蕉久久99天天拍欧美p7| 亚洲欧美一区二区三区电影| 无翼乌全彩之大雄医生| 国产精品亲子乱子伦xxxx裸| 久久午夜神器| 黄色一级片日本| 亚洲狠狠婷婷综合久久久久| 男朋友吃我的妹妹怎么办呢| 国产一级一国产一级毛片| 高嫁肉柳风车动漫| 日本精品一区二区三区在线视频| 国产人伦视频在线观看| 尾野真知子番号| 伊人久久精品久久亚洲一区| 一二三四视频在线观看韩国电视剧| 久久精品欧美日韩精品| 西西人体44rtwww高清大但| 涩涩快播| 国产大片线上免费看| 中国一级黄色| 亚洲欧洲高清| 欧美日产国产亚洲综合图区一| 四虎永久在线精品免费影视| 香港黄色碟片黄色碟片| 国内精品视频一区二区三区八戒 | 波多野结衣av高清一区二区三区| 521a成v视频网站在线入口| 天使萌一区二区在线观看| 村上凉子丰满禁断五十路| 日韩免费一区二区三区| 国产特级毛片aaaaaa毛片| 男女性潮高清免费网站| 三级一级片| 91蝌蚪在线视频| 色丁香在线| 一区二区高清视频在线观看 | 性做久久久久久久久| 黄文在线看| 亚洲一区天堂| 好大的奶女好爽视频|