RM新时代网站-首页

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

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

3天內(nèi)不再提示

淺談Java內(nèi)省

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

作者:京東物流 王國泰

一、什么是內(nèi)省

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

二、內(nèi)省常用API

1、相關(guān)類

2、Introspector

2.1 核心功能

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

2.2 核心方法

getBeanInfo

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

3、BeanInfo

3.1 核心功能

用于提供有關(guān)Bean的元數(shù)據(jù),通常用于描述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 核心功能

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

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能夠觸發(fā)的一組事件,提供了有關(guān)事件監(jiān)聽器類型、添加和移除監(jiān)聽器的方法以及事件通知方法的信息

6.2 核心方法

不常用

三、內(nèi)省常見使用場景

1、依賴注入

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

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

2、對象拷貝

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

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

3、開發(fā)工具和IDE

開發(fā)工具和集成開發(fā)環(huán)境(IDE,如IntelliJ IDEA)使用內(nèi)省來提供代碼補全、重構(gòu)、調(diào)試等功能

四、內(nèi)省優(yōu)缺點

1、優(yōu)點

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

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

2、缺點

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

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

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

可讀性和可維護性:代碼可讀性差,增加調(diào)試難度

五、內(nèi)省與反射的區(qū)別

1、用途

內(nèi)省主要用于Java Bean的屬性操作,適合于標準化的Bean操作

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

2、實現(xiàn)

內(nèi)省是基于Java Beans規(guī)范的,使用java.beans包

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

3、性能

內(nèi)省通常比反射快,主要原因是內(nèi)省使用了緩存機制,減少了權(quán)限檢查,并且在設(shè)計上針對特定場景進行了優(yōu)化

相關(guān)文獻

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

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

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

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


審核編輯 黃宇

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

    關(guān)注

    19

    文章

    2966

    瀏覽量

    104700
收藏 人收藏

    評論

    相關(guān)推薦

    Java基礎(chǔ)知識:內(nèi)省#Java

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

    PCB經(jīng)驗淺談

    PCB經(jīng)驗淺談
    發(fā)表于 08-04 09:33

    手機硬件知識淺談

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

    手機機構(gòu)設(shè)計淺談

    手機機構(gòu)設(shè)計淺談
    發(fā)表于 11-13 11:21

    淺談射頻PCB設(shè)計

    淺談射頻PCB設(shè)計
    發(fā)表于 03-20 15:07

    Java SE、Java EE、Java ME之間的區(qū)別

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

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

    Kaffe移植的關(guān)鍵技術(shù)及方案基于ST20嵌入式系統(tǒng)的Java虛擬機研究與移植
    發(fā)表于 04-25 09:49

    Java的類

    1.1 有關(guān)面向?qū)ο蟮母拍?.2 Java語言的特點1.3 Java的開發(fā)環(huán)境1.4  第一個Java程序1.5 Java類型系統(tǒng)1.6
    發(fā)表于 04-28 14:23 ?0次下載

    java是什么?java概念解釋

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

    JAVA教程之Java畫圖程序

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

    解析c++語言的Qt內(nèi)省機制

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

    虛擬機內(nèi)省與內(nèi)存安全監(jiān)測

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

    淺談Java編程學習 Java基礎(chǔ)語法注意項

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

    Java程序設(shè)計教程之Java語言的基礎(chǔ)知識概述

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

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現(xiàn)方式上存在一些區(qū)別,下面將詳細介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發(fā)各種應用程序
    的頭像 發(fā)表于 07-16 13:35 ?784次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別
    RM新时代网站-首页