俄羅斯:將審查iPhone等外國公司設備 保數據安全
iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
反射是一種能夠在運行時檢查或操作程序結構、元數據和行為的特性。這使得程序能夠動態地獲取關于類、方法、字段等元素的信息,以及在運行時進行相應的操作。
獲取class對象的三種實現
而在Spring框架中,ReflectionUtils是org.springframework.util包下的一個實用工具類,旨在簡化與反射相關的常見任務。它提供了一組方法,使得開發人員能夠更方便地執行反射操作,而不必處理過多的樣板代碼。
/** * 獲取屬性字段 * 可以指定屬性的類型: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);}
/*** 獲取對象的 field 屬性值**/public static void getField() { Demo demo = new Demo(); demo.setName("一安未來"); demo.setAge(20); //獲取Demo中的name屬性字段 Field field = ReflectionUtils.findField(Demo.class, "name"); //取消name屬性的private權限控制 ReflectionUtils.makeAccessible(field); //獲取對象的姓名字段的值 Object value = ReflectionUtils.getField(field, demo); System.out.println(value);}
/** * 設置對象的 field 屬性值 **/public static void setField() { Demo demo = new Demo(); demo.setName("一安未來"); demo.setAge(20); //獲取Demo中的name屬性字段 Field field = ReflectionUtils.findField(Demo.class, "name"); //取消name屬性的private權限控制 ReflectionUtils.makeAccessible(field); //設置對象的姓名字段的值 ReflectionUtils.setField(field, demo, "一安未來_v2"); System.out.println(demo.getName());}
/*** 對象的值復制**/public static void shallowCopyFieldState() { Demo demo = new Demo(); demo.setName("一安未來"); demo.setAge(20); Demo demo1 = new Demo(); //把對象demo的值復制到對象demo1上 ReflectionUtils.shallowCopyFieldState(demo, demo1); System.out.println(demo1);}
/*** 對給定類的所有方法執行一個操作**/public static void doWithMethods(){ ReflectionUtils.doWithMethods(Demo.class, method -> { // 處理每個方法 System.out.println("找到方法:" + method.getName()); });}
/*** 對給定類的所有字段執行一個操作**/public static void doWithFields(){ ReflectionUtils.doWithFields(Demo.class, field -> { // 處理每個字段 System.out.println("找到字段:" + field.getName()); });}
/*** 添加過濾器來選擇性地處理方法或字段**/public static void doWithMethodsFilter(){ ReflectionUtils.doWithMethods( Demo.class, method -> { // 處理符合條件的方法 System.out.println("找到方法:" + method.getName()); }, method -> { // 過濾器:選擇性處理方法的條件 return method.getName().startsWith("get"); } );}
/** * 調用指定方法 **/public static void invokeMethod() throws NoSuchMethodException { Demo demo = new Demo(); // 獲取方法對象 Method method =demo.getClass().getDeclaredMethod("say", String.class); // 要傳遞的參數 String [] methodArgs = { "一安未來" }; 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===============================一安未來===============================一安未來_v2===============================Demo(name=一安未來, 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 一安未來
本文鏈接:http://www.www897cc.com/showinfo-26-59653-0.html掌握ReflectionUtils:解鎖Java反射的無限可能
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Redis發布訂閱,右手就行!