那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺談Java內省

京東云 ? 來源:京東物流 王國泰 ? 作者:京東物流 王國泰 ? 2024-12-19 10:36 ? 次閱讀

作者:京東物流 王國泰

一、什么是內省

講內省,不得不說Java Bean,Bean在Java中是一種特殊的類,主要用于裝載數據,數據會被存儲在類的私有屬性中,通常具有無參構造函數、可序列化、以及通過getter和setter方法來訪問屬性。內省是Java Beans規范的一部分,使用java.beans包中的類來實現,最常用的類是Introspector。通過內省,你可以獲取一個Java Bean的屬性描述符(PropertyDescriptor)和方法描述符(MethodDescriptor)

二、內省常用API

1、相關類

2、Introspector

2.1 核心功能

用于獲取Bean的整體信息,包括屬性描述符、方法描述符和事件描述符等

2.2 核心方法

getBeanInfo

BeanInfo beanInfo = Introspector.getBeanInfo(Vehicle.class);

3、BeanInfo

3.1 核心功能

用于提供有關Bean的元數據,通常用于描述Bean的屬性、事件和方法

3.2 核心方法

getPropertyDescriptors

PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

getMethodDescriptors

MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();

getEventSetDescriptors

EventSetDescriptor[] eventSetDescriptors = beanInfo.getEventSetDescriptors();

4、PropertyDescriptor

4.1 核心功能

用于描述Bean的屬性,提供了對屬性的詳細描述,包括屬性的名稱、類型、讀方法getter、寫方法setter等

4.2 核心方法

getName

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
String name = namePD.getName();

getReadMethod

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
Method getter = namePD.getReadMethod();

String methodName = getter.getName();
String vehicleName = (String) getter.invoke(new Vehicle());

getWriteMethod

PropertyDescriptor namePD = new PropertyDescriptor("name", Vehicle.class);
Method setter = namePD.getWriteMethod();

String methodName = setter.getName();
setter.invoke(new Vehicle(), "JD0001");

5、MethodDescriptor

5.1 核心功能

用于描述一個方法的屬性,提供了對方法的詳細描述,包括方法的名稱、參數類型、返回類型等

5.2 核心方法

getName

MethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));
String name = methodDescriptor.getName();

getMethod

MethodDescriptor methodDescriptor = new MethodDescriptor(Vehicle.class.getMethod("setName", String.class));
Method method = methodDescriptor.getMethod();
method.invoke(new Vehicle(), "JD0001");

6、EventSetDescriptor

6.1 核心功能

用于描述一個Bean能夠觸發的一組事件,提供了有關事件監聽器類型、添加和移除監聽器的方法以及事件通知方法的信息

6.2 核心方法

不常用

三、內省常見使用場景

1、依賴注入

Spring使用內省來分析類的構造函數、字段和方法,并自動注入依賴對象,可參考BeanWrapperImpl,部分源碼如下:

@Override
public PropertyDescriptor[] getPropertyDescriptors() {
  return getCachedIntrospectionResults().getPropertyDescriptors();
}

2、對象拷貝

Spring BeanUtils使用內省來復制對象的屬性,可參考BeanUtils,部分源碼如下:

public static PropertyDescriptor[] getPropertyDescriptors(Class clazz) throws BeansException {
  return CachedIntrospectionResults.forClass(clazz).getPropertyDescriptors();
}

3、開發工具和IDE

開發工具和集成開發環境(IDE,如IntelliJ IDEA)使用內省來提供代碼補全、重構、調試等功能

四、內省優缺點

1、優點

靈活性和可擴展性:允許在運行時動態地獲取和操作對象的屬性和方法

簡化開發工作:支持框架和工具的開發,能夠自動處理對象的屬性和方法

2、缺點

性能開銷:比直接調用方法或訪問字段要慢,而且不當使用可能會導致內存泄漏或增加GC壓力

訪問安全:繞過Java的訪問控制機制,訪問私有字段和方法,可能會帶來安全隱患,特別是在處理敏感數據時

類型安全:通常是基于字符串名稱進行的(如方法名、屬性名),在編譯時無法檢查其正確性,容易導致運行時錯誤

可讀性和可維護性:代碼可讀性差,增加調試難度

五、內省與反射的區別

1、用途

內省主要用于Java Bean的屬性操作,適合于標準化的Bean操作

反射則是更通用的機制,可以操作類的所有成員,包括私有成員

2、實現

內省是基于Java Beans規范的,使用java.beans包

反射是Java語言的核心特性,使用java.lang.reflect包

3、性能

內省通常比反射快,主要原因是內省使用了緩存機制,減少了權限檢查,并且在設計上針對特定場景進行了優化

相關文獻

JavaBeans API Specification:https://docs.oracle.com/javase/8/docs/api/java/beans/package-summary.html

《Java編程思想》(Thinking in Java) - Bruce Eckel

《Java核心技術 卷 I》(Core Java Volume I) - Cay S. Horstmann, Gary Cornell

《Java反射機制詳解》(Java Reflection in Action) - Ira R. Forman, Nate Forman


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    105131
收藏 人收藏

    評論

    相關推薦

    Java基礎知識:內省#Java

    JAVA
    學習硬聲知識
    發布于 :2022年11月16日 17:54:46

    PCB經驗淺談

    PCB經驗淺談
    發表于 08-04 09:33

    手機硬件知識淺談

    手機硬件知識淺談
    發表于 05-15 11:04

    手機機構設計淺談

    手機機構設計淺談
    發表于 11-13 11:21

    淺談射頻PCB設計

    淺談射頻PCB設計
    發表于 03-20 15:07

    Java SE、Java EE、Java ME之間的區別

    本文把JAVA SE、JAVA EE、JAVA ME拿來做下區別,同時也分享一下作者的一些成果。目前的Java平臺根據軟件開發人員、服務提供商和設備生產商可以針對特定的市場可以分為三個
    發表于 07-11 08:31

    淺談Java虛擬機的研究與移植

    Kaffe移植的關鍵技術及方案基于ST20嵌入式系統的Java虛擬機研究與移植
    發表于 04-25 09:49

    Java的類

    1.1 有關面向對象的概念1.2 Java語言的特點1.3 Java的開發環境1.4  第一個Java程序1.5 Java類型系統1.6
    發表于 04-28 14:23 ?0次下載

    java是什么?java概念解釋

    電子發燒友網站提供《java是什么?java概念解釋.pdf》資料免費下載
    發表于 04-17 21:35 ?0次下載

    JAVA教程之Java畫圖程序

    JAVA教程之Java畫圖程序,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:28 ?13次下載

    解析c++語言的Qt內省機制

    所謂 內省 是指面向對象語言的一種在運行期間查詢對象信息的能力, 比如如果該語具有運行期間檢查對象型別的能力,那么我們稱它是型別 內省 (type intropection)的,型別 內省 可以用
    發表于 12-15 10:22 ?1508次閱讀

    虛擬機內省與內存安全監測

    針對在傳統特權虛擬機中利用虛擬機內省實時監測其他虛擬機內存安全的方法不利于安全模塊與系統其他部分的隔離,且會拖慢虛擬平臺的整體性能的問題,提出基于輕量操作系統實現虛擬機內省的安全架構,并提出基于內存
    發表于 01-08 14:15 ?0次下載
    虛擬機<b class='flag-5'>內省</b>與內存安全監測

    淺談Java編程學習 Java基礎語法注意項

    每當說到IT行業時,很多朋友們會想到java,隨著時代的發展,人們學習java的熱度依然只增不減,但關于java,有人會問基礎語法是怎樣的,該如何學習?
    發表于 05-30 16:34 ?1036次閱讀

    Java程序設計教程之Java語言的基礎知識概述

    本文檔詳細介紹的是Java程序設計教程之Java語言的基礎知識概述主要內容包括了:1.Java語言發展簡史,2.Java的特點(為什么要學習java
    發表于 02-22 10:28 ?36次下載
    <b class='flag-5'>Java</b>程序設計教程之<b class='flag-5'>Java</b>語言的基礎知識概述

    華納云:java web和java有什么區別java web和java有什么區別

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現方式上存在一些區別,下面將詳細介紹它們之間的區別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發各種應用程序
    的頭像 發表于 07-16 13:35 ?896次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別
    赌场百家乐打法| 昆明百家乐官网装修装潢有限公司| 亚洲顶级赌场 网投领导者| 全讯网六仔开奖| 网上百家乐是不是真的| 362百家乐的玩法技巧和规则 | 全景网百家乐的玩法技巧和规则 | 太阳城百家乐官网外挂| 皇冠百家乐官网赢钱皇冠| 澳门百家乐官网图形| 百家乐官网赌博代理| 免费百家乐官网奥| 百家乐官网赌场代理| 百家乐官网十赌九诈| 七匹狼百家乐官网的玩法技巧和规则 | 百家乐群shozo权威| 大发888送体验金| 班戈县| 江源县| 百家乐官网送彩金网络| KK百家乐官网娱乐城| 百家乐投注网站是多少| 百家乐金币游戏| 百家乐存1000送| 大发888博狗博彩| 长宁县| 扑克百家乐官网赌器| 百家乐预测和局| 金木棉百家乐的玩法技巧和规则| 太阳城金旭园| 盈丰娱乐| 百家乐官网平台出租家乐平台出租| 宝龙百家乐官网的玩法技巧和规则 | 百家乐官网棋牌技巧| 百家乐官网轮盘| 至尊百家乐20111110| 大发888游戏出纳| 什么是百家乐平注法| 娱乐城设计| 7人百家乐官网中号桌布| 百家乐论坛白菜|