欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java反射機(jī)制,反射相關(guān)API,反射API使用方式(反射獲取實(shí)體類(lèi)字段名和注解值)

 更新時(shí)間:2024年07月09日 15:13:35   作者:xingze_W  
這篇文章主要介紹了Java反射機(jī)制,反射相關(guān)API,反射API使用方式(反射獲取實(shí)體類(lèi)字段名和注解值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 認(rèn)識(shí)反射

Java反射機(jī)制是指在運(yùn)行狀態(tài)中,動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能。

Java的反射機(jī)制是其一大特性,反射機(jī)制是構(gòu)建框架技術(shù)的基礎(chǔ)所在。

Java反射有三個(gè)動(dòng)態(tài)性質(zhì):

  • 運(yùn)行時(shí)生成對(duì)象實(shí)例
  • 運(yùn)行期間調(diào)用方法
  • 運(yùn)行時(shí)更改屬性

Java的反射機(jī)制在編譯時(shí)并不確定是哪個(gè)類(lèi)被加載了,而是在程序運(yùn)行時(shí)才加載、探知、使用,這樣的特點(diǎn)就是反射。

類(lèi)似于光學(xué)中的反射概念,在計(jì)算機(jī)科學(xué)領(lǐng)域,反射是指一類(lèi)應(yīng)用,它們能夠自描述和自控制。

Java反射可實(shí)現(xiàn)的功能:

  • 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
  • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
  • 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的方法和屬性
  • 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法

使用反射的基本步驟

  • 獲得需要操作的類(lèi)的Java.lang.Class對(duì)象
  • 調(diào)用Class的方法獲取Field、Method等對(duì)象
  • 使用反射API進(jìn)行操作

2. 反射相關(guān)API

Java反射技術(shù)常用的類(lèi):

  • Class類(lèi):反射的核心類(lèi),反射所有的操作都是圍繞該類(lèi)來(lái)生成的。通過(guò)Class類(lèi),可以獲取類(lèi)的屬性、方法等內(nèi)容信息。
  • Field類(lèi):表示類(lèi)的屬性,可以獲取和設(shè)置類(lèi)中屬性的值。
  • Method類(lèi):表示類(lèi)的方法,可以用來(lái)獲取類(lèi)中方法的信息,或者執(zhí)行方法。
  • Constructor類(lèi): 表示類(lèi)的構(gòu)造方法。

獲取Class對(duì)象

每個(gè)類(lèi)被加載后,系統(tǒng)就會(huì)為該類(lèi)生成一個(gè)對(duì)應(yīng)的Class對(duì)象,通過(guò)該Class對(duì)象就可以訪問(wèn)JVM中的這個(gè)類(lèi)。

Java程序獲得Class對(duì)象通常有以下三種方式:

  • 調(diào)用對(duì)象的getClass()方法:getClass()方法是java.lang.Object類(lèi)中的一個(gè)方法,所有的Java對(duì)象都可以調(diào)用該方法,該方法會(huì)返回該對(duì)象所屬類(lèi)的Class對(duì)象。

代碼如下:

 Student s = new Student();
 Class c = s.getClass();
  • 調(diào)用類(lèi)的Class屬性:調(diào)用類(lèi)的Class屬性可獲取該類(lèi)對(duì)應(yīng)的Class對(duì)象,這種方式需要在編譯期間就知道類(lèi)的名稱(chēng)。

代碼如下:

Class  s = Student.class;
  • 使用Class類(lèi)的forName()靜態(tài)方法:使用Class類(lèi)的forName()靜態(tài)方法也可以獲取該類(lèi)對(duì)應(yīng)的Class對(duì)象。此方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個(gè)類(lèi)的全名(包名.類(lèi)名)。

代碼如下:

Class s = Class.forName("com.xingze.pojo.Student");      //正確
Class s = Class.forName("Student");       //錯(cuò)誤,會(huì)拋出ClassNotFoundException異常

從Class對(duì)象中獲取信息

在獲得了某個(gè)類(lèi)所對(duì)應(yīng)的Class對(duì)象之后,程序就可以調(diào)用Class對(duì)象的方法來(lái)獲取該類(lèi)的詳細(xì)信息。

Class類(lèi)提供了大量實(shí)例方法來(lái)獲取對(duì)應(yīng)類(lèi)的詳細(xì)信息,如構(gòu)造方法、普通方法、屬性、注解等其他信息。

具體如下:

  • 訪問(wèn)Class對(duì)應(yīng)的類(lèi)包含的構(gòu)造方法
方法說(shuō)明
Constructor getConstructor(Class[] params)返回此Class對(duì)象所包含的指定的public構(gòu)造方法,params參數(shù)是按聲明順序指定該構(gòu)造方法參數(shù)類(lèi)型的Class對(duì)象的一個(gè)數(shù)組。構(gòu)造方法的參數(shù)類(lèi)型與params所指定的參數(shù)類(lèi)型匹配。如:Constructor co = s.getConstructor(String.class,Integer.class); //s是某個(gè)Class對(duì)象
Constructor[] getConstructors(Class[] params)返回此Class對(duì)象所包含的所有public構(gòu)造方法
Constructor getDeclaredConstructor(Class[] params )返回此Class對(duì)象所包含的指定的構(gòu)造方法,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate構(gòu)造方法)
Constructor[] getDeclaredConstructors( )返回此Class對(duì)象所包含的所有構(gòu)造方法,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate構(gòu)造方法)
  • 訪問(wèn)Class對(duì)應(yīng)的類(lèi)包含的方法
方法說(shuō)明
Method getMethod(String name, Class[] params)返回此Class對(duì)象所包含的指定的public方法,name參數(shù)用于指定方法名稱(chēng),params參數(shù)是按聲明順序指定該方法參數(shù)類(lèi)型的Class對(duì)象的一個(gè)數(shù)組。構(gòu)造方法的參數(shù)類(lèi)型與params所指定的參數(shù)類(lèi)型匹配。如:Method m = s.getMethod(“info”,String.class,Integer.class); //s是某個(gè)Class對(duì)象
Method[] getMethods()返回此Class對(duì)象所包含的所有public方法
Method getDeclaredMethod(String name, Class[] params)返回此Class對(duì)象所包含的指定的方法,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate方法)
Method[] getDeclaredMethods( )返回此Class對(duì)象所包含的所有方法,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate方法)
  • 訪問(wèn)Class對(duì)應(yīng)的類(lèi)包含的屬性
方法說(shuō)明
Field getField(String name)返回此Class對(duì)象所包含的指定的public屬性,name參數(shù)用于指定屬性名稱(chēng),如:Field age1 = s.getField(“age”); //s是某個(gè)Class對(duì)象,age為屬性名
Field[] getFields()返回此Class對(duì)象所包含的所有public屬性
Field getDeclaredField(String name)返回此Class對(duì)象所包含的指定的public屬性,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate屬性)
Field[] getDeclaredFields( )返回此Class對(duì)象所包含的所有屬性,與訪問(wèn)級(jí)別無(wú)關(guān)(可訪問(wèn)paivate屬性)
  • 訪問(wèn)Class對(duì)應(yīng)的類(lèi)包含的注解
方法說(shuō)明
< A extends Annotation > A getAnnotation(Class annotationClass)試圖獲取該Class對(duì)象所表示類(lèi)上的所有注解,如果該類(lèi)型的注解不存在則返回null。annotationClass參數(shù)對(duì)應(yīng)于注解類(lèi)型的Class對(duì)象
Annotation[] getAnnotations()返回此類(lèi)上的所有注解
Annotation[] getDeclaredAnnotations()返回直接存在于此類(lèi)上的所有注解
  • 訪問(wèn)Class對(duì)應(yīng)的類(lèi)包含的其他信息
方法說(shuō)明
Class[] getDeclaredClasses()返回Class對(duì)應(yīng)的類(lèi)所在的外部類(lèi)
Class[] getDeclaringClasses()返回Class對(duì)應(yīng)的類(lèi)所在的內(nèi)部類(lèi)
Class[] getInterfaces()返回Class對(duì)應(yīng)的類(lèi)所實(shí)現(xiàn)的全部接口
Class[] getPackage()返回Class對(duì)應(yīng)的類(lèi)所在的包
Class[] getName()返回Class對(duì)應(yīng)的類(lèi)的名稱(chēng)
Class[] getSimpleName()返回Class對(duì)應(yīng)的類(lèi)的簡(jiǎn)稱(chēng)

3. 反射API使用

反射獲取實(shí)體類(lèi)字段名和注解值

/**
  * 獲取指定實(shí)體類(lèi)字段名和title注解值
  *
  */
 public static Map<String, String> getFieldTitleMap(String className) {
     try {
         Map<String, String> map = new HashMap<>();
         Field[] fields = Class.forName(className).getDeclaredFields();
         for (Field field : fields) {
             if (field.isAnnotationPresent(Title.class)) {
                 map.put(field.getName(), field.getAnnotation(Title.class).value());
             }
         }
         return map;
     } catch (Exception e) {
         logger.error(e.getMessage());
     }
     return Collections.emptyMap();
 }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)添加頁(yè)碼到PDF文檔

    Java實(shí)現(xiàn)添加頁(yè)碼到PDF文檔

    頁(yè)碼可以清楚了解總頁(yè)數(shù)、定位頁(yè)數(shù)快速尋找自己所要的文段、打印時(shí)不會(huì)分不清頭中尾。今天這篇文章就將介紹如何通過(guò)Java代碼,以編程的方式將添加頁(yè)碼到PDF文檔,需要的可以參考一下
    2023-04-04
  • Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄

    Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄

    這篇文章主要介紹了Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    這篇文章主要介紹了SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • SpringBoot為啥不用配置啟動(dòng)類(lèi)的實(shí)現(xiàn)

    SpringBoot為啥不用配置啟動(dòng)類(lèi)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot為啥不用配置啟動(dòng)類(lèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 利用Maven添加工程版本信息及時(shí)間戳

    利用Maven添加工程版本信息及時(shí)間戳

    這篇文章主要介紹了利用Maven添加工程版本信息及時(shí)間戳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Android開(kāi)發(fā)Kotlin實(shí)現(xiàn)圓弧計(jì)步器示例詳解

    Android開(kāi)發(fā)Kotlin實(shí)現(xiàn)圓弧計(jì)步器示例詳解

    這篇文章主要為大家介紹了Android開(kāi)發(fā)Kotlin繪制圓弧計(jì)步器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享

    調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享

    這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理解讀

    Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理解讀

    這篇文章主要介紹了Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理詳解,CountDownLatch中調(diào)用await方法線程需要等待所有調(diào)用countDown方法的線程執(zhí)行,這就很適合一個(gè)業(yè)務(wù)需要一些準(zhǔn)備條件,等準(zhǔn)備條件準(zhǔn)備好之后再繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-12-12
  • java通過(guò)Jsoup爬取網(wǎng)頁(yè)過(guò)程詳解

    java通過(guò)Jsoup爬取網(wǎng)頁(yè)過(guò)程詳解

    這篇文章主要介紹了java通過(guò)Jsoup爬取網(wǎng)頁(yè)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 使用BindingResult 自定義錯(cuò)誤信息

    使用BindingResult 自定義錯(cuò)誤信息

    這篇文章主要介紹了使用BindingResult 自定義錯(cuò)誤信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論