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

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

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

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

JavaBean是一種特殊的Java類,通常用于封裝多個屬性為一個單一的對象。我們再復習下JavaBean規(guī)范:

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

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

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

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

java.beans包java.beans包

初識內(nèi)省

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

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

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

首先定義一個JavaBean:

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

這里借助Lombok的@Data注解,生成標準JavaBean。

首先獲取BeanInfo實例:

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

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

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

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

來個小李子

小李子小李子

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

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

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);

輸出結果是:

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呢?

我們再看一下,如果User不符合規(guī)范呢?

public static class UserNoSetter {
    private String username;

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

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

我們再看看上面的結果:

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)省描述符也不認識了。

責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2025-01-20 00:00:00

反射Java語言

2023-12-12 08:41:01

2021-10-14 06:52:47

算法校驗碼結構

2022-09-29 15:32:58

云計算計算模式

2024-09-18 07:00:00

消息隊列中間件消息隊列

2019-12-12 09:23:29

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

2022-03-10 08:25:27

JavaScrip變量作用域

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量

2023-04-26 10:21:04

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2014-05-30 10:23:15

樂跑手環(huán)智能手環(huán)運動手環(huán)

2021-10-28 16:19:37

物聯(lián)網(wǎng)人工智能IoT

2024-06-20 08:06:30

2024-12-04 08:40:19

2024-10-15 11:37:06

2024-06-03 14:27:08

ThisAPIThat

2020-10-08 18:58:46

條件變量開發(fā)線程

2019-01-07 13:01:08

Linux驚嘆用法命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在线观看 | 亚洲国产精品第一区二区 | 国产农村妇女精品一区 | 日韩在线视频观看 | 久久久精品一区 | 日日摸夜夜添夜夜添特色大片 | 欧美成人视屏 | 色爱综合网 | 国产一区影院 | 高清视频一区 | 精品国产乱码久久久久久闺蜜 | 日韩伦理一区二区三区 | 亚洲精品日韩一区二区电影 | 黄色一级大片视频 | 精品国产一区二区三区性色av | 天天碰日日操 | 精国产品一区二区三区四季综 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲情综合五月天 | 国产精品久久久久久久久久久久午夜片 | 日本黄色一级视频 | 国产精品久久久久久久免费大片 | 在线免费观看日本 | 国产亚洲一区二区三区 | 成人午夜黄色 | 国产一区2区 | 国产av毛片 | 夜夜爽99久久国产综合精品女不卡 | 亚洲精品国产综合区久久久久久久 | 色综合天天天天做夜夜夜夜做 | 亚洲最大av | 91婷婷韩国欧美一区二区 | 亚洲一区二区视频在线观看 | 日本一区视频在线观看 | 亚洲国产精品91 | 国产欧美精品一区二区 | 国产一区 | 亚洲97 | 中文字幕亚洲区 | 久久久久久黄 | 国产一级片一区二区 |