成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

掌握ReflectionUtils:解鎖Java反射的無限可能

開發 開發工具
在Spring框架中,ReflectionUtils是org.springframework.util包下的一個實用工具類,旨在簡化與反射相關的常見任務。它提供了一組方法,使得開發人員能夠更方便地執行反射操作,而不必處理過多的樣板代碼。

前言

反射是一種能夠在運行時檢查或操作程序結構、元數據和行為的特性。這使得程序能夠動態地獲取關于類、方法、字段等元素的信息,以及在運行時進行相應的操作。

獲取class對象的三種實現

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

而在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 屬性值

/**
* 獲取對象的 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 屬性值

/**
 * 設置對象的 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 一安未來

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-09-05 15:48:21

2024-03-18 08:33:16

2024-11-01 10:34:45

2024-05-20 00:00:00

2024-04-30 09:17:06

SpringBootMybatis動態數據源

2025-01-02 14:30:00

AI訓練模型

2017-09-07 12:54:59

華為云計算HC大會

2023-09-27 22:53:04

圖像處理是開源Java

2015-05-21 08:53:21

華為HNC/華為

2021-01-24 07:42:35

前端Table組件技術熱點

2015-12-25 09:51:13

售前工程師圣誕成長

2023-10-27 14:25:26

組件庫無限可能性

2012-09-21 10:04:03

寬帶華為

2017-07-14 09:06:10

存儲數據中心HCI

2018-07-31 10:04:22

京東云教育

2023-10-27 09:03:20

NginxWeb服務器

2022-07-19 14:04:39

數字化平臺

2021-03-08 07:23:33

Java IO 系統

2021-04-07 07:48:00

測試開發Java反射Spring
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩伦理一区二区三区 | 亚洲女人天堂成人av在线 | 国产乱码一二三区精品 | 亚洲一区导航 | 久久久视频在线 | 午夜天堂精品久久久久 | 免费一级做a爰片久久毛片潮喷 | 逼逼网| 91精品久久久久久久久中文字幕 | 欧美视频在线观看 | 一级做a爰片性色毛片 | 国产成人精品免费视频大全最热 | 国产精品成人一区二区三区夜夜夜 | 久久精品国产99国产精品 | 日本免费一区二区三区四区 | 午夜影晥 | av网站免费| 久久性av| 九九爱这里只有精品 | 在线看片福利 | 免费一区| 国产精品日韩欧美一区二区三区 | 麻豆久久久9性大片 | 在线一区二区三区 | 99精品久久久久久中文字幕 | 欧美久久一区二区三区 | 欧美天堂在线观看 | 精品日韩一区二区 | 亚洲 欧美 日韩在线 | 精品国产三级 | 91精品免费| 色偷偷人人澡人人爽人人模 | 免费a级毛片在线播放 | 国产精品久久午夜夜伦鲁鲁 | 亚洲一区二区三区视频 | 伊人久久大香线 | 在线亚洲人成电影网站色www | 91亚洲精品在线 | 一区二区成人 | 欧美亚洲国产日韩 | 亚洲性视频 |