一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內不再提示

淺談Java內省

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

作者:京東物流 王國泰

一、什么是內省

講內省,不得不說Java Bean,Bean在Java中是一種特殊的類,主要用于裝載數(shù)據(jù),數(shù)據(jù)會被存儲在類的私有屬性中,通常具有無參構造函數(shù)、可序列化、以及通過getter和setter方法來訪問屬性。內省是Java Beans規(guī)范的一部分,使用java.beans包中的類來實現(xiàn),最常用的類是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的元數(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ā)的一組事件,提供了有關事件監(jiān)聽器類型、添加和移除監(jiān)聽器的方法以及事件通知方法的信息

6.2 核心方法

不常用

三、內省常見使用場景

1、依賴注入

Spring使用內省來分析類的構造函數(shù)、字段和方法,并自動注入依賴對象,可參考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、開發(fā)工具和IDE

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

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

1、優(yōu)點

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

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

2、缺點

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

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

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

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

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

1、用途

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

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

2、實現(xiàn)

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

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

3、性能

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

相關文獻

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


審核編輯 黃宇

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

    關注

    20

    文章

    2983

    瀏覽量

    106499
收藏 人收藏

    評論

    相關推薦

    Java基礎知識:內省#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

    淺談射頻PCB設計

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

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

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

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

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

    Java的類

    1.1 有關面向對象的概念1.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內省機制

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

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

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

    java基礎——java.util.ConcurrentModificationException

    本文檔內容介紹了java基礎java.util.ConcurrentModificationException,供參考
    發(fā)表于 03-13 11:31 ?2次下載

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

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

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

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

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

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現(xiàn)方式上存在一些區(qū)別,下面將詳細介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發(fā)各種應用程序
    的頭像 發(fā)表于 07-16 13:35 ?1265次閱讀
    華納云:<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ū)別