Java的反射機制以及使用場景

Java的反射機制以及使用場景

  • 什么是反射
  • Class對象
  • 如何使用
    • 獲取 Class 類對象
    • 反射創造對象
      • 反射獲取類的構造器
      • 反射獲取類的成員變量
      • 反射獲取類的方法
  • 反射的應用場景
    • JDBC 的數據庫的連接
    • Spring 框架的使用

什么是反射

Oracle 官方對反射的解釋

Reflection is commonly used by programs which require the ability to examine or
modify the runtime behavior of applications running in the Java virtual machine.
This is a relatively advanced feature and should be used only by developers who
have a strong grasp of the fundamentals of the language. With that caveat in
mind, reflection is a powerful technique and can enable applications to perform
operations which would otherwise be impossible.

Java 的反射機制是指:

  • 在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法;
  • 并且對于任意一個對象,都能夠調用它的任意一個方法;
  • 這種動態獲取信息以及動態調用對象方法的功能成為Java語言的反射機制。

白話解釋

萬物有陰必有陽,有正必有反。既然有反射,就必有“正射”。

那么正射是什么呢?

  1. 正射

我們在編寫代碼時,當需要使用到某一個類的時候,都會先了解這個類是做什么的。然后實例化這個類,接著用實例化好的對象進行操作,這就是正射。

Student student = new Student();
student.doHomework("數學");
  1. 反射

反射就是,一開始并不知道我們要初始化的類對象是什么,自然也無法使用 new 關鍵字來創建對象了。

 Class clazz = Class.forName("reflection.Student");Method method = clazz.getMethod("doHomework", String.class);Constructor constructor = clazz.getConstructor();Object object = constructor.newInstance();method.invoke(object, "語文");

正射與反射對比

以上兩段代碼,執行效果是一樣的,如圖:

在這里插入圖片描述
但是,其實現的過程還是有很大的差別的:

第一段代碼在未運行前就已經知道了要運行的類是Student;

第二段代碼則是到整個程序運行的時候,從字符串reflection.Student,才知道要操作的類是Student。

結論

反射就是在運行時才知道要操作的類是什么,并且可以在運行時獲取類的完整構造,并調用對應的方法。

Class對象

要理解Class對象,我們先來了解一下RTTI吧。

RTTI(Run-Time Type Identification)運行時類型識別,其作用是在運行時識別一個對象的類型和類的信息。

Java是如何讓我們在運行時識別對象和類的信息的?主要有兩種方式:

  • 一種是傳統的RRTI,它假定我們在編譯期已知道了所有類型。
  • 另一種是反射機制,它允許我們在運行時發現和使用類的信息。

每個類都有一個Class對象,每當編譯一個新類就產生一個Class對象(更恰當地說,是被保存在一個同名的.class文件中)。比如創建一個Student類,那么,JVM就會創建一個Student對應Class類的Class對象,該Class對象保存了Student類相關的類型信息。

在這里插入圖片描述

Class類的對象作用是運行時提供或獲得某個對象的類型信息。

如何使用

獲取 Class 類對象

獲取反射中的Class對象有三種方法。

  • 第一種,使用 Class.forName 靜態方法。
Class class1 = Class.forName("reflection.TestReflection");
  • 第二種,使用類的.class 方法
Class class2 = TestReflection.class;
  • 第三種,使用實例對象的 getClass() 方法。
TestReflection testReflection = new TestReflection();
Class class3 = testReflection.getClass();

在這里插入圖片描述

反射創造對象

通過反射創造對象,獲取方法,成員變量,構造器

通過反射創建類對象主要有兩種方式:

在這里插入圖片描述

實例代碼:

//方式一
Class class1 = Class.forName("reflection.Student");
Student student = (Student) class1.newInstance();
System.out.println(student);//方式二
Constructor constructor = class1.getConstructor();
Student student1 = (Student) constructor.newInstance();
System.out.println(student1);

運行結果:

在這里插入圖片描述

反射獲取類的構造器

在這里插入圖片描述

反射獲取類的成員變量

在這里插入圖片描述

反射獲取類的方法

在這里插入圖片描述

反射的應用場景

反射是Java框架的靈魂技術,很多框架都使用了反射技術,如spring,Mybatis,Hibernate等。

JDBC 的數據庫的連接

在JDBC連接數據庫中,一般包括加載驅動,獲得數據庫連接等步驟。而加載驅動,就是引入相關Jar包后,通過Class.forName() 即反射技術,加載數據庫的驅動程序。

Spring 框架的使用

Spring 通過 XML 配置模式裝載 Bean,也是反射的一個典型例子。
裝載過程:

  1. 將程序內XML 配置文件加載入內存中
  2. Java類解析xml里面的內容,得到相關字節碼信息
  3. 使用反射機制,得到Class實例
  4. 動態配置實例的屬性,使用

這樣做當然是有好處的:
不用每次都去new實例了,并且可以修改配置文件,比較靈活。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15112.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零自制docker-14-【實現 mydocker commit 打包容器成鏡像】

文章目錄 目標注意exec.Commandtar代碼結果 目標 piveroot切換工作目錄到/merged后,通過docker commit將此時工作目錄的文件系統保存下來,使用tar包將該文件系統打包為tar文件 命令類似 ./mydocker commit myimage然后當前目錄下會得到myimage.tar 注意…

「實用推薦」如何為桌面 移動跨平臺應用選擇UI框架/APP架構?

DevExpress .NET MAUI UI組件庫提供了用于Android和iOS移動開發的高性能UI組件,該庫包括數據網格、圖表、日程、數據編輯器、CollectionView和選項卡組件。 獲取DevExpress .NET MAUI最新正式版下載(Q技術交流:532598169) “一次編寫&#…

ABB機器人---基礎編程

目錄 第一章 代碼解釋 1.1 基礎代碼 1.1.2 關于 VAR robtarget pos 1.1.3 關于四元數 1.2 機器人初始化程序 1.3 配置通信 (ProfiNet 示例,ABB RAPID) 1.4 設置干涉區 (ABB RAPID) 1.5 示教軌跡和自動過程 (ABB RAPID) 1.6 配置抓手并進行抓取操作 (ABB RA…

springboot錯誤

錯誤總結 1、使用IDEA 的 initialalzer顯示2、IDEA 新建文件 沒有 java class3、java: 錯誤: 不支持發行版本 22解決方法4、IDEA-SpringBoot項目yml配置文件不自動提示解決辦法 1、使用IDEA 的 initialalzer顯示 IDEA創建SpringBoot項目時出現:Initialization fail…

公認最好用的隨身wifi品牌推薦!歐本VS閃魚VS格行隨身wifi哪款更好用?歐本隨身wifi靠譜嗎?

最近小編后臺私信快被問爆了,都想讓測評一下自己相中的隨身wifi到底行不行。該說不說隨身wifi品牌真是越來越多了,今天就挑選咨詢量最多的三款:格行,歐本,閃魚!咱們各方面都實測一下,看看哪款更…

基于ucos-ii操作系統的生產者消費者-問題

目 錄 第1章 題目分析. 1 1.1 生產者線程... 1 1.2 消費者線程... 1 1.3 緩沖區... 1 1.4 進程的同步與互斥... 1 第2章 解決方案. 2 2.1 總體方案... 2 2.2 生產者問題... 2 2.3 消費者問題... 3 2.4 進程問題... 5 第3章 實驗結果. 6 3.1 運行結果... 6 3.2 結果分析... 8 第…

提取 Chrome、Firefox 中儲存的用戶密碼用于憑據發現

操作環境 Chrome 瀏覽器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 瀏覽器 Version 126.0 (64 位) Chrome 瀏覽器儲存密鑰原理 新的 Chrome 瀏覽器儲存密碼的方案是使用 Chrome 生成的 AES 密鑰對用戶密碼進行加密之后儲存在 Sqlite 數據庫文件中,A…

Qt資源系統用法筆記 qrc

目錄 創建和使用.qrc文件的步驟: 步驟1: 創建.qrc文件 步驟2: 編輯.qrc文件 步驟3: 在代碼中使用資源 步驟4: 編譯和運行 優點和注意事項 c調用: Qt資源系統(Qt Resource System)提供了一種將應用程序所需的文件&#xff0…

Linux 內核之 mmap 內存映射的原理及源碼解析

文章目錄 前言一、簡介1. mmap 是什么?2. Linux 進程虛擬內存空間 二、mmap 內存映射1. mmap 內存映射的實現過程2. mmap 內存映射流程2.1 mmap 系統調用函數2.2 ksys_mmap_pgoff 函數2.3 vm_mmap_pgoff 函數2.4 do_mmap_pgoff 函數2.5 do_mmap 函數2.6 get_unmappe…

私域流量的真諦:構建并運營屬于你自己的私域生態

大家好,我是來自一家專注于私域電商行業的軟件開發公司的產品經理,擁有超過七年的行業經驗。今天,我想和大家聊聊私域流量的真正含義,以及為何我們應該關注并努力打造屬于自己的私域生態。 什么是私域流量? 私域流量&…

HCIA第二天復習上

延長傳輸距離-------中繼器(放大器)------物理層設備 可以延長5倍傳輸距離 增加網絡節點數量 網絡拓撲結構 1直線型拓撲 信息安全性差 網絡延遲高傳輸速度慢 2環形拓撲 3星型拓撲 4網狀型拓撲 傳輸效率高,…

【字典樹 馬拉車算法】336. 回文對

本文涉及知識點 字典樹 馬拉車算法 336. 回文對 給定一個由唯一字符串構成的 0 索引 數組 words 。 回文對 是一對整數 (i, j) &#xff0c;滿足以下條件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;兩個字…

通過注意力調節實現更好的文本到圖像生成對齊

近年來&#xff0c;生成性AI技術在眾多領域取得了前所未有的進步。大規模預訓練模型的出現激發了各種下游任務中的新應用。這在文本到圖像生成領域尤為明顯&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已經顯著展示了它們的能力。盡管如此&#xff0c;復雜提示中…

appium篇-windows桌面自動化(一)[環境配置]

1、windows版本&#xff1a;win10 2、winSdk版本 Windows SDK and emulator archive | Microsoft Developer 3、winAppDriver版本 1.2.99 Releases microsoft/WinAppDriver (github.com) ################ 4、python版本 Python 3.9.13 ############### 5、appium版本 Re…

hubilder Android模擬器華為手機連接不上

APP真機測試注意點&#xff1a; 1. 同一個局域網下 2. 手機連接USB模式&#xff08;華為選擇USB配置&#xff1a;音頻來源&#xff09; &#xff0c;開發者模式 3. 實在不行重啟HBuilderX再運行真機 可是卡在了“正在安裝手機端HBuilder調試基座...” 就沒反應了&#xff1f;&…

【高時效通路】

一 高時效通路 1.1 pathchdumper 實時數據拉取、實時數據處理、5分鐘微批dump來加速時效性&#xff0c;具體來說&#xff1a; 實時數據拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接對接F0層實時拉取最新數據&#xff0c;保證該…

Springboot整合Minio對象存儲超級詳細講解以及配置搭建

windows環境下搭建minio步驟 1.從minio官網進行查看詳細信息 地址&#xff1a;https://min.io/里面有詳細的配置信息搭建成功之后如下如所示&#xff1a;用戶名密碼默認情況下為 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的訪問 地址&…

python - 分割 pytest 的 conftest.py 文件

解決 pytest 的 conftest.py 文件過大問題。 1. 項目目錄結構 project_name ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── project_name │ ├── __init__.py │ ├── testing │ │ ├── __init__.py │ │ ├── fixtur…

vue項目實戰 - 如果高效的實現防抖和節流

在Vue項目中&#xff0c;處理高頻事件的優化至關重要&#xff0c;直接影響用戶體驗和應用性能。防抖&#xff08;Debounce&#xff09;和節流&#xff08;Throttle&#xff09;是兩種常用且有效的方法&#xff0c;可以控制事件觸發頻率&#xff0c;減少不必要的資源消耗。如何在…

SEO優化,小白程序員如何做SEO優化流量從0到1

原文鏈接&#xff1a;SEO優化&#xff0c;小白程序員如何做SEO優化流量從0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎優化(Search Engine Optimization)&#xff0c;是一種通過優化網站結構、內容和外部鏈接等因素&#xff0c;提高網站在搜索引擎中的自然排名&…