最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot工具類ReflectionUtils使用教程

 更新時(shí)間:2022年12月30日 10:58:46   作者:凡夫販夫  
這篇文章主要介紹了Springboot內(nèi)置的工具類之ReflectionUtils的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

前言

ReflectionUtils應(yīng)該是Springboot內(nèi)置工具類梳理的最后一篇了,可能很多人都沒(méi)有聽(tīng)說(shuō)過(guò)這個(gè)工具類,這個(gè)類封裝的是一些與java反射相關(guān)的靜態(tài)工具方法。可能很多人也知道反射,卻不怎么經(jīng)常使用反射。其實(shí)反射是一個(gè)很有用的技術(shù)點(diǎn),我認(rèn)為是可以和AOP比肩的,甚至有過(guò)之而不及。大家都知道AOP是面向切面編程,可以在定義的切面前、后執(zhí)行一些操作,但是反射更厲害,它可以在程序運(yùn)行時(shí),對(duì)已裝載的任意類的屬性和方法進(jìn)行操作,這就是java的反射機(jī)制。

ReflectionUtils

org.springframework.util.ReflectionUtils中包含的靜態(tài)方法其實(shí)有很多,主要分為兩類:對(duì)類中屬性的操作和對(duì)類中方法的操作。

對(duì)屬性的操作

獲取屬性字段

Field findField(Class clazz,Stringname),在類中查找指定屬性。

@Test
public void test1(){
    //查找屬性字段realName
    Field realName = ReflectionUtils.findField(Employee.class, "realName");
    Assert.notNull(realName, "獲取員工類的姓名屬性失敗");
}

Field findField(Class clazz,Stringname, Classtype),更精確的在類中查找指定屬性,可以在指定屬性的類型。

@Test
public void test2(){
     //查找屬性字段realName,類型是String
    Field realName = ReflectionUtils.findField(Employee.class, "realName",String.class);
    Assert.notNull(realName, "獲取員工類的姓名屬性失敗");
}

設(shè)置屬性字段的值

ObjectgetField(Field field,Objecttarget),獲取 target 對(duì)象的 field 屬性值。

@Test
public void test3() {
    //聲名一個(gè)對(duì)象,姓名是zhangsan
    Employee zhangsan = new Employee("zhangsan");
    //獲取Employee類中的realName屬性字段
    Field field = ReflectionUtils.findField(Employee.class, "realName");
    //取消realName屬性的private權(quán)限控制
    ReflectionUtils.makeAccessible(field);
    //獲取員工對(duì)象的姓名字段的值
    Object value = ReflectionUtils.getField(field, zhangsan);
    Assert.isTrue(value.equals("zhangsan"),"員工zhangsan的姓名字段取值失敗" );
}

voidsetField(Field field,Objecttarget,Objectvalue),可以設(shè)置 target 對(duì)象的 field 屬性值,值為 value。

@Test
public void test4() {
    Employee zhangsan = new Employee("zhangsan");
    //獲取Employee類中的realName屬性字段
    Field field = ReflectionUtils.findField(Employee.class, "realName");
    //取消realName屬性的private權(quán)限控制
    ReflectionUtils.makeAccessible(field);
    //把員工對(duì)象zhangsan的姓名字段值設(shè)置為zhangsan_v2
    ReflectionUtils.setField(field, zhangsan, "zhangsan_v2");
    Object value = ReflectionUtils.getField(field, zhangsan);
    Assert.isTrue(value.equals("zhangsan_v2"),"員工zhangsan的姓名字段取值失敗" );
}

voidshallowCopyFieldState(Objectsrc,Objectdest),如果兩個(gè)對(duì)象是同一個(gè)類的實(shí)現(xiàn),且希望把一對(duì)象的值復(fù)制到另外一個(gè)對(duì)象上,可以使用這個(gè)方法,src是源對(duì)象,dest是目標(biāo)對(duì)象。

@Test
public void test5() {
    Employee zhangsan = new Employee("zhangsan");
    Employee tmp = new Employee();
    //把對(duì)象zhangsan的值復(fù)制到對(duì)象tmp上,這里要注意,復(fù)制的對(duì)象類型要相同
    ReflectionUtils.shallowCopyFieldState(zhangsan, tmp);
    Assert.isTrue(tmp.getRealName().equals("zhangsan"),"對(duì)象的屬性復(fù)制失敗了" );
}

voidmakeAccessible(Field field),取消java的權(quán)限控制檢查,方便private私有訪問(wèn)權(quán)限的操作。

@Test
public void test4() {
    Employee zhangsan = new Employee("zhangsan");
    //取消realName屬性的private權(quán)限控制
    ReflectionUtils.makeAccessible(field);
}

voiddoWithFields(Class clazz, ReflectionUtils.FieldCallback fc),可以對(duì)類的每個(gè)屬性執(zhí)行 回調(diào)方法,簡(jiǎn)單的理解就是可以定義一個(gè)回調(diào)方法,在對(duì)類的屬性操作完后,回調(diào)方法內(nèi)的邏輯就會(huì)被執(zhí)行。另外還有兩個(gè)方法,功能也很類似:void doWithFields(Class clazz, ReflectionUtils.FieldCallback fc,ReflectionUtils.FieldFilter ff),不僅有回調(diào)方法,還可以增加過(guò)濾的邏輯;voiddoWithLocalFields(Class clazz, ReflectionUtils.FieldCallback fc),只對(duì)本類的屬性可以執(zhí)行回調(diào)方法,不包括父類的。舉個(gè)例子,簡(jiǎn)單的理解一下,實(shí)在理解不了就放棄吧,因?yàn)槲乙灿X(jué)得這個(gè)確實(shí)有點(diǎn)雞肋。假如員的性別在程序中是以1和0進(jìn)行區(qū)分,對(duì)外展示的時(shí)候要轉(zhuǎn)換為“男”和“女”:

public class  SexFieldCallBack<T>  implements ReflectionUtils.FieldCallback{
    private Object obj;
    private Integer sexFlag=-1;
    public SexFieldCallBack(Object obj) {
        this.obj = obj;
    }
    @Override
    public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
        field.setAccessible(true);
        if (field.getName().equals("sexFlag")) {
            Object value = field.get(obj);
            this.sexFlag= ((Integer) value);
        }
        if(field.getName().equals("sex")){
            if (1==this.sexFlag) {
                field.set(obj, "男");
            }
            if (0==this.sexFlag) {
                field.set(obj, "女");
            }
        }
    }
}
@Test
public void test6() throws IllegalAccessException, InstantiationException {
    Employee employee = Employee.class.newInstance();
    employee.setRealName("zhangsan");
    //性別標(biāo)志位,1:男,0:女
    employee.setSexFlag(1);
    ReflectionUtils.doWithFields(Employee.class,new SexFieldCallBack(employee) );
    Assert.isTrue("男".equals(employee.getSex()), "性別轉(zhuǎn)換失敗了");
}

對(duì)方法的操作

@Data
public class Employee implements Serializable {
    private String realName;
    public void hello(String name) {
        System.out.println(name + ",你好!我是" + this.realName);
    }
    public void say(String name) {
        System.out.println(name + ",你好!我是" + this.realName);
    }
    public String hello(String name, Boolean isReturn) {
        String msg = name + ",你好!我是" + this.realName;
        if (isReturn) {
            System.out.println(msg);
            return msg;
        }
        return null;
    }
}

獲取方法

Method findMethod(Classclazz,Stringname),在類中查找指定名字方法

@Test
public void test7() throws IllegalAccessException, InstantiationException, InvocationTargetException {
    //查找類中的hello方法
    //這里要注意如果類中有方法名相同的重載方法時(shí),一要要用下面的方法,把參數(shù)的類型給帶上
    //如果不是重載方法,用這個(gè)也沒(méi)問(wèn)題
    Method say = ReflectionUtils.findMethod(Employee.class, "say");
    Employee employee = Employee.class.newInstance();
    employee.setRealName("zhangsan");
    say.invoke(employee, "lisi");
}

Method findMethod(Class clazz,Stringname, Class... paramTypes),有的時(shí)候同一個(gè)類可能會(huì)有多個(gè)方法名相同,形參數(shù)不同的重載方法,可以使用這個(gè)方法更精確的在類中找到指定方法;

@Test
public void test8() throws IllegalAccessException, InstantiationException, InvocationTargetException {
    Method hello = ReflectionUtils.findMethod(Employee.class, "hello",String.class,Boolean.class);
    Employee employee = Employee.class.newInstance();
    employee.setRealName("zhangsan");
    //執(zhí)行employee對(duì)象的hello方法
    Object msg = hello.invoke(employee, "lisi",true);
    System.out.println(msg);
}

Method[] getAllDeclaredMethods(Class leafClass),獲得類中所有方法,包括繼承而來(lái)的。

@Test
public void test9()  {
    //獲取類中所有的方法,包括繼承而來(lái)的
    Method[] methods = ReflectionUtils.getAllDeclaredMethods(Employee.class);
    for (Method o : methods) {
        System.out.println(o.getName());
    }
}

執(zhí)行方法

ObjectinvokeMethod(Method method,Objecttarget),執(zhí)行無(wú)參數(shù)的方法;

ObjectinvokeMethod(Method method,Objecttarget,Object... args),執(zhí)行有參數(shù)的方法

voidmakeAccessible(Method method),如果是私有方法,可以取消 Java 權(quán)限檢查,以便后續(xù)執(zhí)行該私有方法

@Test
public void test10() throws IllegalAccessException, InstantiationException, InvocationTargetException {
    //獲取set方法
    Method setRealName = ReflectionUtils.findMethod(Employee.class, "setRealName", String.class);
    //反射實(shí)例化一個(gè)對(duì)象
    Employee employee = Employee.class.newInstance();
    //放開(kāi)權(quán)限檢查
    ReflectionUtils.makeAccessible(setRealName);
    //執(zhí)行set方法
    setRealName.invoke(employee, "zhangsan");
    //獲取get方法
    Method getRealName = ReflectionUtils.findMethod(Employee.class, "getRealName");
    //執(zhí)行g(shù)et方法
    Object result = getRealName.invoke(employee);
    Assert.isTrue(result.equals("zhangsan"), "getRealName方法執(zhí)行失敗");
}

到此這篇關(guān)于Springboot工具類ReflectionUtils使用教程的文章就介紹到這了,更多相關(guān)Springboot ReflectionUtils內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法

    Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法

    這篇文章主要介紹了Java拖曳鼠標(biāo)實(shí)現(xiàn)畫線功能的方法,需要的朋友可以參考下
    2014-07-07
  • 如何使用jenkins實(shí)現(xiàn)發(fā)布部分更新文件

    如何使用jenkins實(shí)現(xiàn)發(fā)布部分更新文件

    這篇文章主要介紹了如何使用jenkins實(shí)現(xiàn)發(fā)布部分更新文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Mybatis-plus foreach拼接字符串查詢無(wú)數(shù)據(jù)返回問(wèn)題

    Mybatis-plus foreach拼接字符串查詢無(wú)數(shù)據(jù)返回問(wèn)題

    這篇文章主要介紹了Mybatis-plus foreach拼接字符串查詢無(wú)數(shù)據(jù)返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行案例

    Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行案例

    這篇文章主要介紹了Java實(shí)現(xiàn)的兩個(gè)線程同時(shí)運(yùn)行,涉及java多線程相關(guān)操作與使用技巧,需要的朋友可以參考下
    2019-07-07
  • java中將科學(xué)計(jì)數(shù)法轉(zhuǎn)換普通計(jì)數(shù)法的簡(jiǎn)單方法

    java中將科學(xué)計(jì)數(shù)法轉(zhuǎn)換普通計(jì)數(shù)法的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇java中將科學(xué)計(jì)數(shù)法轉(zhuǎn)換普通計(jì)數(shù)法的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢

    使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢

    這篇文章主要介紹了使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring設(shè)計(jì)模式中代理模式詳細(xì)講解

    Spring設(shè)計(jì)模式中代理模式詳細(xì)講解

    如何實(shí)現(xiàn)在不修改源碼的基礎(chǔ)上實(shí)現(xiàn)代碼功能的增強(qiáng)呢?spring為我們提供了代理模式。所謂的代理模式通俗來(lái)說(shuō)就是一個(gè)中介,它給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制原對(duì)象的引用,從而實(shí)現(xiàn)在不修改源碼的基礎(chǔ)上實(shí)現(xiàn)代碼功能的增強(qiáng)
    2023-01-01
  • Java面向?qū)ο蟪绦蛟O(shè)計(jì):抽象類,接口用法實(shí)例分析

    Java面向?qū)ο蟪绦蛟O(shè)計(jì):抽象類,接口用法實(shí)例分析

    這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計(jì):抽象類,接口用法,結(jié)合實(shí)例形式分析了java抽象類與接口相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • java實(shí)現(xiàn)文件和base64相互轉(zhuǎn)換

    java實(shí)現(xiàn)文件和base64相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)文件和base64相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Java基礎(chǔ)之如何學(xué)好Java

    Java基礎(chǔ)之如何學(xué)好Java

    這篇文章已經(jīng)是有數(shù)年“網(wǎng)齡”的老文,不過(guò)在今天看來(lái)仍然經(jīng)典。如何學(xué)習(xí)java?本篇文章可以說(shuō)也是面對(duì)編程初學(xué)者的一篇指導(dǎo)文章,其中對(duì)于如何學(xué)習(xí)Java的步驟的介紹,很多也適用于開(kāi)發(fā)領(lǐng)域其他技能的學(xué)習(xí)。
    2014-10-10

最新評(píng)論

慈溪市| 黄龙县| 双流县| 新昌县| 甘南县| 琼海市| 锦屏县| 水城县| 荃湾区| 黄山市| 奉节县| 邹平县| 宁陕县| 卢龙县| 济宁市| 永顺县| 玉屏| 苏州市| 萨嘎县| 郴州市| 虞城县| 平南县| 富民县| 九台市| 潜山县| 安远县| 随州市| 社旗县| 富阳市| 成都市| 金门县| 宁海县| 大英县| 宝坻区| 仪陇县| 聊城市| 霍邱县| 镇远县| 大冶市| 高州市| 公主岭市|