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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

JavaSE(十六)——反射

發(fā)布時間:2025/3/13 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE(十六)——反射 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1. 概述
  • 2. Class類
  • 3. 獲取Class對象的三種方式
  • 4. 獲取類的結(jié)構(gòu)信息
  • 5. 創(chuàng)建類的對象
  • 6. 調(diào)用指定的方法
  • 7. 反射操作泛型

1. 概述

  • Java可稱為“準(zhǔn)動態(tài)語言”,有一定的動態(tài)性,可以利用反射機(jī)制獲得類似動態(tài)語言(即在運(yùn)行時代碼可依據(jù)某些條件改變自身結(jié)構(gòu))的特性。
  • 反射機(jī)制:在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。
  • 要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。
  • 反射相關(guān)的主要API
    java.lang.Class: 代表一個類
    java.lang.reflect.Method : 代表類的方法
    java.lang.reflect.Field : 代表類的成員變量
    java.lang.reflect.Constructor : 代表類的構(gòu)造器

2. Class類

  • 在Object類中定義了方法:public final Class getClass(),此方法將被所有子類繼承。

  • (1)Class 本身也是一個類
    (2)Class 對象只能由系統(tǒng)建立對象
    (3)一個加載的類在 JVM 中只會有一個Class實例
    (4)一個Class對象對應(yīng)的是一個加載到JVM中的一個.class文件
    (5)每個類的實例都會記得自己是由哪個 Class 實例所生成
    (6)通過Class可以完整地得到一個類中的所有被加載的結(jié)構(gòu)
    (7) Class類是Reflection的根源,針對任何你想動態(tài)加載、運(yùn)行的類,唯有先獲得相應(yīng)的 Class對象

  • Class類的常用方法

  • Java內(nèi)存分析

3. 獲取Class對象的三種方式

  • ① Object類的getClass()方法
    ② 靜態(tài)屬性class
    ③ Class類中靜態(tài)方法forName()

  • 案例:

  • 運(yùn)行結(jié)果:

4. 獲取類的結(jié)構(gòu)信息

  • 對象就包含了完整的類的結(jié)構(gòu)信息??梢酝ㄟ^這個對象看到類的結(jié)構(gòu)。這個對象就像一面鏡子,透過這個鏡子看到類的結(jié)構(gòu),如類名、屬性(字段)、方法、構(gòu)造器等。
  • 代碼演示:

5. 創(chuàng)建類的對象

  • 調(diào)用forName()返回的是Class,后需要調(diào)用newInstance()實例化

  • 方式一: 調(diào)用Class對象的newInstance()方法,條件:①類必須有一個無參數(shù)的構(gòu)造器, ②類的構(gòu)造器的訪問權(quán)限需要足。

  • 方式二:1)通過Class類的getDeclaredConstructor(Class … parameterTypes)取得本類的指定形參類型的構(gòu)造器 2)向構(gòu)造器的形參中傳遞一個對象數(shù)組進(jìn)去,里面包含了構(gòu)造器中所需的各個參數(shù)。 3)通過Constructor實例化對象

  • 代碼:

  • 運(yùn)行結(jié)果:

6. 調(diào)用指定的方法

  • 通過反射,調(diào)用類中的方法,通過Method類完成。
    ① 通過Class類的getMethod(String name,Class…parameterTypes)方法取得 一個Method對象,并設(shè)置此方法操作時所需要的參數(shù)類型。
    ② 之后使用Object invoke(Object obj, Object[] args)進(jìn)行調(diào)用,并向方法中傳 遞要設(shè)置的obj對象的參數(shù)信息。

  • 代碼:

  • 若原方法聲明為private,則需要在調(diào)用invoke()方法之前,顯示調(diào)用方法對象的setAccessible(true)方法,將可訪問private的方法。

  • 代碼:

7. 反射操作泛型

  • Java采用泛型擦除的機(jī)制來引入泛型,Java中的泛型僅僅是給編譯器javac使用的,確保數(shù)據(jù)的安全性和免去強(qiáng)制類型轉(zhuǎn)換問題,但是一旦編譯完成,所有和泛型有關(guān)的類型全部擦除。
  • 為了通過反射操作這些類型 , Java新增了 ParameterizedType , GenericArrayType , TypeVariable 和 WildcardType 幾種類型來代表不能被歸一到Class類中的類型但是又和原始類型齊名的類型。
  • ParameterizedType : 表示一種參數(shù)化類型,比如Collection GenericArrayType : 表示一種元素類型是參數(shù)化類型或者類型變量的數(shù)組類型
    TypeVariable : 是各種類型變量的公共父接口
    WildcardType : 代表一種通配符類型表達(dá)式

總結(jié)

以上是生活随笔為你收集整理的JavaSE(十六)——反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。