日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

掌握ReflectionUtils:解鎖Java反射的無(wú)限可能

來(lái)源: 責(zé)編: 時(shí)間:2024-01-10 09:35:22 217觀看
導(dǎo)讀前言反射是一種能夠在運(yùn)行時(shí)檢查或操作程序結(jié)構(gòu)、元數(shù)據(jù)和行為的特性。這使得程序能夠動(dòng)態(tài)地獲取關(guān)于類、方法、字段等元素的信息,以及在運(yùn)行時(shí)進(jìn)行相應(yīng)的操作。獲取class對(duì)象的三種實(shí)現(xiàn)Class<? extends Demo> clazz =

前言

反射是一種能夠在運(yùn)行時(shí)檢查或操作程序結(jié)構(gòu)、元數(shù)據(jù)和行為的特性。這使得程序能夠動(dòng)態(tài)地獲取關(guān)于類、方法、字段等元素的信息,以及在運(yùn)行時(shí)進(jìn)行相應(yīng)的操作。qsX28資訊網(wǎng)——每日最新資訊28at.com

qsX28資訊網(wǎng)——每日最新資訊28at.com

獲取class對(duì)象的三種實(shí)現(xiàn)qsX28資訊網(wǎng)——每日最新資訊28at.com

  • Class<? extends Demo> clazz = demo.getClass();
  • Class<Demo> clazz = Demo.class;
  • Class clazz = Class.forName("com.demo.Demo");

而在Spring框架中,ReflectionUtils是org.springframework.util包下的一個(gè)實(shí)用工具類,旨在簡(jiǎn)化與反射相關(guān)的常見(jiàn)任務(wù)。它提供了一組方法,使得開(kāi)發(fā)人員能夠更方便地執(zhí)行反射操作,而不必處理過(guò)多的樣板代碼。qsX28資訊網(wǎng)——每日最新資訊28at.com

演示

獲取屬性字段

/** * 獲取屬性字段 * 可以指定屬性的類型:findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type)**/public static void findField(){    //查找屬性字段name    Field name = ReflectionUtils.findField(Demo.class, "name");    System.out.println(name);}

獲取對(duì)象的 field 屬性值

/*** 獲取對(duì)象的 field 屬性值**/public static void getField() {    Demo demo = new Demo();    demo.setName("一安未來(lái)");    demo.setAge(20);    //獲取Demo中的name屬性字段    Field field = ReflectionUtils.findField(Demo.class, "name");    //取消name屬性的private權(quán)限控制    ReflectionUtils.makeAccessible(field);    //獲取對(duì)象的姓名字段的值    Object value = ReflectionUtils.getField(field, demo);    System.out.println(value);}

設(shè)置對(duì)象的 field 屬性值

/** * 設(shè)置對(duì)象的 field 屬性值 **/public static void setField() {    Demo demo = new Demo();    demo.setName("一安未來(lái)");    demo.setAge(20);    //獲取Demo中的name屬性字段    Field field = ReflectionUtils.findField(Demo.class, "name");    //取消name屬性的private權(quán)限控制    ReflectionUtils.makeAccessible(field);    //設(shè)置對(duì)象的姓名字段的值    ReflectionUtils.setField(field, demo, "一安未來(lái)_v2");    System.out.println(demo.getName());}

對(duì)象的值復(fù)制

/*** 對(duì)象的值復(fù)制**/public static void shallowCopyFieldState() {    Demo demo = new Demo();    demo.setName("一安未來(lái)");    demo.setAge(20);    Demo demo1 = new Demo();    //把對(duì)象demo的值復(fù)制到對(duì)象demo1上    ReflectionUtils.shallowCopyFieldState(demo, demo1);    System.out.println(demo1);}

對(duì)給定類的所有方法執(zhí)行一個(gè)操作

/*** 對(duì)給定類的所有方法執(zhí)行一個(gè)操作**/public static void doWithMethods(){    ReflectionUtils.doWithMethods(Demo.class, method -> {        // 處理每個(gè)方法        System.out.println("找到方法:" + method.getName());    });}

對(duì)給定類的所有字段執(zhí)行一個(gè)操作

/*** 對(duì)給定類的所有字段執(zhí)行一個(gè)操作**/public static void doWithFields(){    ReflectionUtils.doWithFields(Demo.class, field -> {        // 處理每個(gè)字段        System.out.println("找到字段:" + field.getName());    });}

添加過(guò)濾器來(lái)選擇性的處理方法或字段

/*** 添加過(guò)濾器來(lái)選擇性地處理方法或字段**/public static void doWithMethodsFilter(){    ReflectionUtils.doWithMethods(            Demo.class,            method -> {                // 處理符合條件的方法                System.out.println("找到方法:" + method.getName());            },            method -> {                // 過(guò)濾器:選擇性處理方法的條件                return method.getName().startsWith("get");            }    );}

調(diào)用指定方法

/** * 調(diào)用指定方法 **/public static void invokeMethod() throws NoSuchMethodException {    Demo demo = new Demo();    // 獲取方法對(duì)象    Method method =demo.getClass().getDeclaredMethod("say", String.class);    // 要傳遞的參數(shù)    String [] methodArgs = { "一安未來(lái)" };    ReflectionUtils.makeAccessible(method);    ReflectionUtils.invokeMethod(method, demo, methodArgs);}

測(cè)試

public static void main(String[] args) throws NoSuchMethodException {    findField();    System.out.println("===============================");    getField();    System.out.println("===============================");    setField();    System.out.println("===============================");    shallowCopyFieldState();    System.out.println("===============================");    doWithMethods();    System.out.println("===============================");    doWithFields();    System.out.println("===============================");    doWithMethodsFilter();    System.out.println("===============================");    invokeMethod();}

輸出:qsX28資訊網(wǎng)——每日最新資訊28at.com

private java.lang.String org.yian.reflectionUtils.Demo.name===============================一安未來(lái)===============================一安未來(lái)_v2===============================Demo(name=一安未來(lái), age=20)===============================找到方法:equals找到方法:toString找到方法:hashCode找到方法:getName找到方法:setName找到方法:say找到方法:getAge找到方法:setAge找到方法:canEqual找到方法:finalize找到方法:wait找到方法:wait找到方法:wait找到方法:equals找到方法:toString找到方法:hashCode找到方法:getClass找到方法:clone找到方法:notify找到方法:notifyAll找到方法:registerNatives===============================找到字段:name找到字段:age===============================找到方法:getName找到方法:getAge找到方法:getClass===============================I'm 一安未來(lái)

qsX28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-59653-0.html掌握ReflectionUtils:解鎖Java反射的無(wú)限可能

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Redis發(fā)布訂閱,右手就行!

下一篇: 記錄一下Python不同數(shù)據(jù)對(duì)象的空值校驗(yàn)!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 永德县| 刚察县| 威信县| 庄河市| 武安市| 门头沟区| 梨树县| 云霄县| 华安县| 含山县| 和田县| 沅江市| 长岭县| 玉田县| 宜兰县| 竹溪县| 金阳县| 漳州市| 津南区| 苍溪县| 儋州市| 柞水县| 盐边县| 三明市| 榆社县| 全南县| 房产| 白水县| 开鲁县| 盐亭县| 祁连县| 长丰县| 兴文县| 海兴县| 漳浦县| 屯留县| 安西县| 盐边县| 宁安市| 商都县| 抚州市|