反射是一種能夠在運(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)
而在Spring框架中,ReflectionUtils是org.springframework.util包下的一個(gè)實(shí)用工具類,旨在簡(jiǎn)化與反射相關(guān)的常見(jiàn)任務(wù)。它提供了一組方法,使得開(kāi)發(fā)人員能夠更方便地執(zhí)行反射操作,而不必處理過(guò)多的樣板代碼。
/** * 獲取屬性字段 * 可以指定屬性的類型: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 屬性值**/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 屬性值 **/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ù)制**/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è)操作**/public static void doWithMethods(){ ReflectionUtils.doWithMethods(Demo.class, method -> { // 處理每個(gè)方法 System.out.println("找到方法:" + method.getName()); });}
/*** 對(duì)給定類的所有字段執(zhí)行一個(gè)操作**/public static void doWithFields(){ ReflectionUtils.doWithFields(Demo.class, field -> { // 處理每個(gè)字段 System.out.println("找到字段:" + field.getName()); });}
/*** 添加過(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)用指定方法 **/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);}
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();}
輸出:
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)
本文鏈接: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ā)布訂閱,右手就行!