国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java 的反射、內省,你會用嗎?

開發 前端
反射是Java語言的一個特性,允許程序在運行時檢查和操作類、方法、字段等。反射可以動態地獲取類的所有屬性和方法,并且可以動態調用這些方法。

你好,我是看山。

Java的反射和內省是兩個在運行時操作類和對象的強大機制,它們之間存在關聯和區別。很多時候我們用錯了,就會有性能上的損失。

概念

反射(Reflection)

反射是Java語言的一個特性,允許程序在運行時檢查和操作類、方法、字段等。反射可以動態地獲取類的所有屬性和方法,并且可以動態調用這些方法。

反射強調的是運行狀態,即在程序運行時能夠訪問和修改類的狀態或行為。反射提供了更底層的類結構和行為訪問機制。

反射的核心類都在java.reflect包下,主要類如下:

圖片圖片

圖片圖片

內省(Introspection)

內省是基于反射實現的,主要用于操作符合JavaBean規范的類。

JavaBean是一種特殊的Java類,通常用于封裝多個屬性為一個單一的對象。

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

內省操作只針對JavaBean,只有符合JavaBean規則的類的成員才可以采用內省API進行操作。

內省的核心類在java.beans包下,主要類如下:

圖片圖片

關系與區別

  • 適用范圍:

反射可以操作任何類的所有成員,包括私有成員。

內省主要針對JavaBean,只能操作符合JavaBean規范的類的成員。

  • 操作方式:
  • 反射是先得到類的字節碼(Class)后再進行各種操作。
  • 內省是先得到屬性描述器(PropertyDescriptor)后再進行各種操作。
  • 復雜度:
  • 反射提供了更底層的訪問機制,使用起來相對復雜。
  • 內省提供了一套比較簡單和有層次的API,更專注于JavaBean的屬性操作。
  • 應用場景:
  • 反射適用于需要動態獲取和調用類信息的場景,如框架開發。
  • 內省適用于需要操作JavaBean屬性的場景。

來點小栗子

使用反射創建對象并調用方法

我們通過反射創建對象并調用指定方法:

public static void main(String[] args)
        throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException,
        IllegalAccessException, NoSuchFieldException {
    final Class<?> clazz = MyClass.class;
    // Class<?> clazz = new MyClass().getClass();
    // Class<?> clazz = Class.forName("cn.howardliu.tutorials.core.reflect.ReflectDemo.MyClass");

    final Constructor<?> constructor = clazz.getConstructor();
    // Constructor<?> constructor = clazz.getConstructor(String.class);
    final Object o = constructor.newInstance();

    final Field field = clazz.getDeclaredField("name");
    field.setAccessible(true);
    field.set(o, "看山");

    final Method method = clazz.getMethod("echoName");
    final Object result = method.invoke(o);
    System.out.println(result);
}

@Data
@NoArgsConstructor
@AllArgsConstructor
publicstaticclass MyClass {
    private String name;

    public String echoName() {
        return name;
    }
}

首先,我們獲取class對象,有三種方式:

  • 通過類名直接獲取:Class<?> clazz = MyClass.class;
  • 通過實例獲取:Class<?> clazz = new MyClass().getClass();
  • 通過加載類:Class<?> clazz = Class.forName("cn.howardliu.tutorials.core.reflect.ReflectDemo.MyClass"); 。

然后獲取構造器對象,使用Class對象的getConstructor()或getDeclaredConstructor()方法獲取構造器對象。

  • 無參構造函數:Constructor<?> constructor = clazz.getConstructor();
  • 有參構造函數:Constructor<?> constructor = clazz.getConstructor(String.class); 。

使用newInstance()創建實體對象:final Object o = constructor.newInstance();。

示例中我們對name屬性賦值,首先得獲取Field對象,可以用getDeclaredField()或者getField()。

因為name屬性是非public的,調用setAccessible設置可訪問,然后賦值。

最后就是獲取Method對象,使用invoke方法實現對象的動作。

以上就是反射常用的邏輯了。反射還提供了基于枚舉的API,有需要的時候可以用一用。

通過內省給對象賦值

內省就是轉為JavaBean準備的,主要包括下面幾個類:

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

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

使用屬性的讀方法獲取數據,使用寫方法賦值。

public static void main(String[] args)
        throws IntrospectionException, InvocationTargetException, IllegalAccessException {
    final BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
    final User user = new User();

    // 遍歷所有屬性描述符
    for (PropertyDescriptor prop : beanInfo.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);
}

@Data
publicstaticclass User {
    private String username;
}

在JavaBean的操作方面,內省確實比反射更方便。

文末總結

今天通過示例介紹了Java的反射和內省,下次我們看看在Bean賦值方面,兩者的性能差異有多少。

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

2025-01-10 00:00:00

內省機制JavaBean描述器

2010-03-12 08:55:06

Java內省反射

2018-09-29 15:34:34

JavaList接口

2020-06-04 14:15:55

Java中BigDecimal函數

2025-08-06 08:53:35

2025-01-15 00:00:00

Java內省性能

2019-07-25 12:46:32

Java高并發編程語言

2023-11-01 13:48:00

反射java

2021-05-21 12:36:16

限流代碼Java

2024-03-06 08:15:03

@Autowired注入方式Spring

2023-12-01 11:13:50

JavaTreeSet

2021-08-11 10:00:51

緩存MyBatis管理

2021-09-06 10:42:18

Linux命令服務器

2019-01-28 17:42:33

Python數據預處理數據標準化

2025-01-03 08:40:53

Java并發編程Guava庫

2021-11-03 17:40:51

Python線程

2024-04-08 00:00:00

asyncawaiPromise

2022-02-10 09:04:50

架構

2009-07-14 18:09:08

Jython的內省

2018-06-26 10:04:41

Siri語音微信
點贊
收藏

51CTO技術棧公眾號

国产精品一 二 三| 久久天堂电影网| 国产在线xxxx| 中文字幕乱码亚洲无线精品一区| 日韩女优电影在线观看| 在线黄色国产视频| 99国产精品久久久久久久久久| 成人在线观看av| 欧美精选一区二区三区| 亚洲天堂av网| 麻豆传媒在线免费| 亚洲最新视频在线播放| 精品国产一区三区| 国产很黄免费观看久久| 国产精品国产一区二区| 欧美大奶一区二区| 免费成人高清视频| 亚洲黄色网址| 精品美女久久久久久免费| ts人妖交友网站| www..com久久爱| 国内少妇毛片视频| 欧美精品一级二级| 成人毛片免费在线观看| 日韩精品一区二区三区四区| 97精品视频在线| 国内久久精品| 日韩美女在线视频| 久久久国产精华液999999| 欧美日韩国产探花| 高清欧美一区二区三区| 欧美舌奴丨vk视频| 精品成人免费观看| 免费大片黄在线| 91精品国产综合久久久久久漫画| 精品久久av| 精品久久久久久电影| 老司机aⅴ毛片免费观看| 日本一二三区在线视频| 成人午夜免费av| 久久国产精品免费观看| 美国一区二区三区在线播放 | 在线中文字幕资源| 亚洲女爱视频在线| 99re6在线视频| 欧美高清在线一区二区| 国产福利视频在线播放| 久久久久久毛片| 天堂网在线免费观看| 国产人成亚洲第一网站在线播放| 国产精彩视频一区二区| 99国产欧美久久久精品| 精品这里只有精品| 久久久久久久性| 日本www.色| 樱桃视频在线观看一区| av毛片免费看| 一区二区理论电影在线观看| 日韩黄色网址| 色天天综合色天天久久| 在线观看av的网站| 精品免费日韩av| www.26天天久久天堂| 欧美福利在线观看| 在线亚洲a色| 91av免费看| 日韩精品国产精品| 欧美日韩中文字幕在线播放| 久久久精品黄色| 蜜桃特黄a∨片免费观看| 精品日韩中文字幕| 最近中文字幕免费mv2018在线| 国产视频一区在线| 国产精品极品| 999视频在线免费观看| 国产欧美日韩综合一区在线播放 | 久久porn| 成人免费在线看片| 激情欧美日韩一区二区| 国产天堂在线播放| 欧美性色视频在线| 亚洲午夜天堂| 久久久亚洲网站| 亚洲精品护士| 免费看的黄色大片| 亚洲va韩国va欧美va| 在线āv视频| 欧美精品一区二区三区国产精品| 国产亚洲欧美日韩在线观看一区二区| 岛国视频一区| 国产69精品久久99不卡| 一级毛片免费看| 欧美精品一区男女天堂| 视频一区国产| 久久精品magnetxturnbtih| 91丨porny丨在线| 日本精品专区| 中文字幕日韩av| 国产精品豆花视频| 久久久成人精品一区二区三区| 日本一区二区成人在线| 免费在线观看黄| 国外成人免费在线播放| 一本久久知道综合久久| 另类小说第一页| 欧美一级片免费看| 欧美激情15p| 日韩欧美第二区在线观看| 《视频一区视频二区| 免费av不卡在线观看| 欧美一级电影免费在线观看| 另类小说欧美激情| 嫩草研究院在线| 欧美成人免费小视频| 日韩黄色一级片| av在线www| 一区二区三区无码高清视频| 亚洲啪啪91| 最新中文字幕免费视频| 精品欧美乱码久久久久久1区2区| 深爱激情久久| 欧美日韩精品在线一区二区 | 欧美日本不卡高清| **毛片在线网站| 亚洲日本高清| 亚洲精品一区二区三区影院| 国产精品久久久久久久久久久久久久久| 亚洲精品男人| 欧美午夜电影在线| 婷婷亚洲婷婷综合色香五月| 国产精品久久久久7777按摩| 免费成人在线电影| 91传媒视频免费| 国产精品久久久久毛片软件| 亚洲天堂手机| 国产电影一区二区三区| 人与动性xxxxx免费视频| 日韩色av导航| 国内精品伊人久久久久av一坑| 国产大片在线免费观看| 国产精品夫妻激情| 亚洲欧美日韩小说| 成人黄色理论片| 少妇久久久久久被弄到高潮| 日韩精品一区二区三区视频| 亚洲国内精品| yourporn在线观看视频| 日韩欧美在线1卡| 亚洲国产二区| 成人影视在线播放| 欧美日韩另类丝袜其他| 欧美精品一区二区不卡| 国产成人午夜片在线观看高清观看| 99久久婷婷国产综合精品首页| 人妻精品无码一区二区三区| 羞羞色国产精品| 欧美性猛交xxxx黑人| 99成人在线| gogo亚洲高清大胆美女人体| 国产福利一区视频| 亚洲jizzjizz日本少妇| 亚洲第一网中文字幕| 久久色.com| 色婷婷热久久| 黄色羞羞视频在线观看| 熟女性饥渴一区二区三区| 国产精品人人做人人爽| 在线综合视频播放| 成人黄色在线视频| 日韩av久操| 蜜桃麻豆av在线| 91婷婷韩国| 日本黄网免费一区二区精品| 久久不射热爱视频精品| 欧美日韩亚洲激情| 国产精品系列在线播放| 欧美伦理在线视频| 成年人黄色大片在线| 国模私拍视频| 中文字幕不卡每日更新1区2区| 久久欧美在线电影| 欧美一区二区精品久久911| 国产人伦精品一区二区| 欧美精选一区| 伊人久久大香伊蕉在人线观看热v| 特黄国产免费播放| 制服国产精品| 国产女人18毛片水18精品| 亚洲色图国产精品| 欧美性猛交xxxx富婆| 91一区二区在线| 在线欧美不卡| 亚洲第一二区| 中文字幕伦理免费在线视频 | 亚洲午夜精品久久久久久性色 | 91九色精品| 伊人久久大香| 日本一级理论片在线大全| 欧美成人黄色网址| 亚洲视频在线二区|