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

比反射更好用的內(nèi)省,你知道嗎?

開發(fā) 前端
內(nèi)省機(jī)制通過反射獲取屬性描述器(PropertyDescriptor),然后可以方便地獲取和設(shè)置屬性值。內(nèi)省操作只針對(duì)JavaBean,只有符合JavaBean規(guī)則的類的成員才可以采用內(nèi)省API進(jìn)行操作。

內(nèi)省是基于反射實(shí)現(xiàn)的,主要用于操作符合JavaBean規(guī)范的類。

JavaBean是一種特殊的Java類,通常用于封裝多個(gè)屬性為一個(gè)單一的對(duì)象。我們?cè)購?fù)習(xí)下JavaBean規(guī)范:

  • 必須要有一個(gè)公共無參構(gòu)造;
  • Javabean類不應(yīng)有公共屬性,屬性都應(yīng)該是 private;
  • 為私有(private聲明)屬性提供符合命名規(guī)范的getter/setter方法;
  • 應(yīng)該要實(shí)現(xiàn)Serializeable接口(內(nèi)省并不強(qiáng)要求這一條);
  • javaBean類必須是一個(gè)公共類,將其訪問屬性設(shè)置為public。

內(nèi)省機(jī)制通過反射獲取屬性描述器(PropertyDescriptor),然后可以方便地獲取和設(shè)置屬性值。

內(nèi)省操作只針對(duì)JavaBean,只有符合JavaBean規(guī)則的類的成員才可以采用內(nèi)省API進(jìn)行操作。

內(nèi)省的核心類在java.beans包下,主要類如下:

java.beans包java.beans包

初識(shí)內(nèi)省

內(nèi)省就是轉(zhuǎn)為JavaBean準(zhǔn)備的,主要包括下面幾個(gè)類:

  1. Introspector類:這是內(nèi)省API的核心類,提供了獲取BeanInfo對(duì)象的方法,例如Introspector.getBeanInfo()方法。
  2. BeanInfo類:這個(gè)類包含了關(guān)于一個(gè)對(duì)象的所有Bean屬性信息,包括屬性的描述符(PropertyDescriptor)。
  3. PropertyDescriptor類:表示一個(gè)JavaBean屬性的信息,包括getter和setter方法。

以下是一個(gè)簡(jiǎn)單的示例,我們首先獲取User的JavaBean信息BeanInfo,然后找到屬性描述符PropertyDescriptor列表。

首先定義一個(gè)JavaBean:

@Data
public static class User {
    private String username;
}

這里借助Lombok的@Data注解,生成標(biāo)準(zhǔn)JavaBean。

首先獲取BeanInfo實(shí)例:

final BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

此時(shí)beanInfo中就可以獲取User類的所有定義:

  • 通過getMethodDescriptors()可以獲取方法描述;
  • 通過getPropertyDescriptors()可以獲取屬性描述;
  • 使用PropertyDescriptor可以生成指定屬性的描述;

少年,至此你已經(jīng)學(xué)會(huì)屠龍技,可以開始屠龍了。

來個(gè)小李子

小李子小李子

話說小李子年輕時(shí)候真帥,可惜歲月是把殺豬刀~~

咳咳,言歸正傳,我們用上面學(xué)到的直接開始:

final BeanInfo userBeanInfo = Introspector.getBeanInfo(User.class);
final User user = new User();

for (MethodDescriptor methodDescriptor : userBeanInfo.getMethodDescriptors()) {
    System.out.println("Method Name: " + methodDescriptor.getName());
    final ParameterDescriptor[] parameterDescriptors = methodDescriptor.getParameterDescriptors();
    if (parameterDescriptors == null) {
        continue;
    }
    for (ParameterDescriptor parameterDescriptor : parameterDescriptors) {
        System.out.println("Parameter Name: " + parameterDescriptor.getName());
        System.out.println("Parameter DisplayName: " + parameterDescriptor.getDisplayName());
    }
}

// 遍歷所有屬性描述符
for (PropertyDescriptor prop : userBeanInfo.getPropertyDescriptors()) {
    System.out.println("Property Name: " + prop.getName());

    // 獲取getter方法
    final Method readMethod = prop.getReadMethod();
    if (readMethod != null) {
        Object value = readMethod.invoke(user);
        System.out.println("Property Value: " + value);
    }

    if ("username".equals(prop.getName())) {
        // 獲取setter方法
        final Method writeMethod = prop.getWriteMethod();
        if (writeMethod != null) {
            Object value = writeMethod.invoke(user, "看山");
            System.out.println("Property Value: " + value);
        }
    }
}
System.out.println(user);

輸出結(jié)果是:

Method Name: getClass
Method Name: wait
Method Name: notifyAll
Method Name: notify
Method Name: wait
Method Name: getUsername
Method Name: hashCode
Method Name: setUsername
Method Name: wait
Method Name: equals
Method Name: toString
Property Name: class
Property Value: class cn.howardliu.tutorials.core.reflect.IntrospectorDemo$User
Property Name: username
Property Value: null
Property Value: null
IntrospectorDemo.User(username=看山)

我們可以看到,MethodDescriptor方法描述符包含了User類的所有方法,包括父類的方法。

如果不是JavaBean呢?

我們?cè)倏匆幌拢绻鸘ser不符合規(guī)范呢?

public static class UserNoSetter {
    private String username;

    public void username(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "UserNoSetter{" +
                "username='" + username + '\'' +
                '}';
    }
}

我們?cè)倏纯瓷厦娴慕Y(jié)果:

Method Name: getClass
Method Name: wait
Method Name: notifyAll
Method Name: notify
Method Name: wait
Method Name: hashCode
Method Name: setUsername
Method Name: wait
Method Name: equals
Method Name: toString
Method Name: username
Property Name: class
Property Value: class cn.howardliu.tutorials.core.reflect.IntrospectorDemo$UserNoSetter
UserNoSetter{username='null'}

可以看到,方法除了自定義的username和setUsername,其他都是相同的,但是setUsername我們定義成了builder模式,所以內(nèi)省描述符也不認(rèn)識(shí)了。

責(zé)任編輯:武曉燕 來源: 看山的小屋
相關(guān)推薦

2025-01-20 00:00:00

反射Java語言

2023-12-12 08:41:01

2019-12-12 09:23:29

Hello World操作系統(tǒng)函數(shù)庫

2022-03-10 08:25:27

JavaScrip變量作用域

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2023-04-26 10:21:04

2024-09-18 07:00:00

消息隊(duì)列中間件消息隊(duì)列

2021-10-14 06:52:47

算法校驗(yàn)碼結(jié)構(gòu)

2022-09-29 15:32:58

云計(jì)算計(jì)算模式

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量

2024-02-05 12:08:07

線程方式管理

2019-01-07 13:01:08

Linux驚嘆用法命令

2023-02-28 07:39:18

2016-11-22 15:43:13

機(jī)房制冷發(fā)展史

2025-01-16 16:41:00

ObjectConditionJDK

2023-08-29 09:31:01

Scrapy網(wǎng)頁爬蟲

2024-02-19 00:00:00

Docker輕量級(jí)容器

2024-01-01 08:25:53

ViewSurface框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 伊人热久久 | 日韩精品视频在线观看一区二区三区 | 一级毛片免费 | 国产精品一区一区三区 | 东方伊人免费在线观看 | 久久久黄色| 国产a视频 | 国产亚洲精品综合一区 | 久久99精品久久久久久青青日本 | 美女一级a毛片免费观看97 | 国产色网站 | 精品日韩 | 精品日韩 | 日韩成人免费视频 | 精品国产乱码久久久久久久久 | 国产四虎 | 在线中文字幕视频 | 国产精品久久久久久久岛一牛影视 | 毛片久久久 | 福利社午夜影院 | 国产精品久久久久av | 日韩午夜精品 | 中文字幕 亚洲一区 | 欧美a在线| 欧美全黄 | 日韩在线一区二区 | 久久久久久久久久久久91 | 国内精品视频在线观看 | 亚洲精品v | 国产精品一区久久久 | 国产午夜精品一区二区三区在线观看 | 99久久免费精品国产免费高清 | 国产乱码精品一区二区三区中文 | 日韩精品一区二区不卡 | 日韩成人免费视频 | 日韩国产三区 | 在线欧美一区 | 欧美日韩在线免费观看 | 亚洲日日夜夜 | 国产日产精品一区二区三区四区 | 中文字幕日韩欧美 |