Java的反射機制詳解:動態操作類和對象

????????Java反射是一種強大的機制,允許程序在運行時查詢和操作類、方法、接口等。這種能力使得Java應用可以在運行時動態地創建對象、調用方法和訪問屬性,極大地提升了程序的靈活性和可擴展性。本文將深入探討Java反射的原理、核心API和實際應用場景,以及如何正確和有效地使用反射。

#### 1. 反射機制基礎

反射機制主要通過`java.lang.reflect`包中的類和接口提供支持,包括`Class`、`Method`、`Field`、`Constructor`等核心類。使用反射的第一步通常是獲取`Class`對象的引用,它是反射操作的起點。

- **獲取Class對象**:
? - 直接通過類的`.class`屬性。
? - 通過實例對象調用`getClass()`方法。
? - 使用`Class.forName()`靜態方法,這種方式常用于動態加載類。

```java
Class<String> stringClass = String.class;
Class<?> clazz = "Hello, World!".getClass();
Class<?> dynamicClass = Class.forName("java.lang.String");
```

#### 2. 查詢類信息

反射可以用來查詢類的構造函數、方法、字段和父類信息。這對于編寫通用代碼庫和框架尤為重要,因為它們需要能處理未知的類。

- **查詢方法**:
? - `getDeclaredMethods()`:返回類中聲明的所有方法,包括公有、保護、默認(包)訪問和私有方法,但不包括繼承的方法。
? - `getMethods()`:返回類中所有公有的方法,包括從父類繼承的公有方法。

- **查詢字段**:
? - `getDeclaredFields()`:返回類中聲明的所有字段。
? - `getFields()`:返回類中所有公有的字段,包括從父類繼承的。

#### 3. 創建對象和訪問屬性

反射不僅可以用于查詢,還可以用于創建對象和訪問對象的屬性和方法。

- **創建對象**:
? - 使用`Class.newInstance()`(已棄用)或者通過`Constructor`對象的`newInstance()`方法創建類的實例。
??
- **訪問字段和方法**:
? - 通過`Field`對象的`get()`和`set()`方法讀寫對象的屬性。
? - 通過`Method`對象的`invoke()`方法調用對象的方法。

```java
Constructor<String> constructor = String.class.getConstructor(String.class);
String strObj = constructor.newInstance("Hello");
Method method = clazz.getMethod("length");
int length = (Integer) method.invoke(strObj);
```

#### 4. 反射的應用場景

- **框架開發**:如Spring框架廣泛使用反射來實現依賴注入和服務定位。
- **插件和擴展機制**:反射允許動態加載和擴展應用的功能。
- **代碼分析工具**:反射用于開發各種代碼分析和測試工具。

#### 5. 反射的注意事項

盡管反射非常強大,但它也有一些缺點,如性能開銷較大和安全風險。因此,在考慮使用反射時,需要權衡其帶來的便利和潛在的問題。

#### 6. 總結

Java反射提供了一種強大的工具來增加程序的靈活性和可擴展性。通過本文的介紹,希望您能夠更好地理解反射的原理和應用,以及如何在您的Java應用中有效地利用這一機制。正確使用反射可以為開發高度可配置的應用和框架提供巨大的幫助

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

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

相關文章

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南

Flutter 中的 CupertinoSlidingSegmentedControl 小部件&#xff1a;全面指南 在Flutter框架中&#xff0c;CupertinoSlidingSegmentedControl是一個用于創建類似iOS風格的滑動分段控制器的小部件。這種控制器通常用于允許用戶在不同的視圖或設置之間切換。本文將為您提供一個…

輕量級 K8S 環境 安裝minikube

文章目錄 操作系統DockerDocker CE 鏡像源站使用官方安裝腳本自動安裝 &#xff08;僅適用于公網環境&#xff09;安裝校驗Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard參考資料 操作系統 …

Docker進入容器查看內容并從容器里拷貝文件到宿主機

工作中需要從docker正在運行的鏡像中復制文件到宿主機&#xff0c;于是便將這個過程記錄了下來。 &#xff08;1&#xff09;查看正在運行的容器 通過以下命令&#xff0c;可以查看正在運行的容器&#xff1a; docker ps &#xff08;2&#xff09;進入某個容器執行腳本 我…

前端人員選擇組件封裝

功能&#xff1a; 人員選擇&#xff0c;返回人員參數&#xff0c;以及人員參數id數組支持單選&#xff0c;多選人員支持重新選擇回顯上次選中人員 <!-- 彈窗 --><a-modal v-model"modalVisible" :footer"null" :bodyStyle"{ padding: 0 }&q…

react中子傳父信息

思路是&#xff1a; 在父組件定義一個函數接受參數&#xff0c;接收的參數用于接收子組件的信息&#xff0c;把函數傳給子組件&#xff0c;子組件調用父親傳來的函數并把要告訴父親的話傳到函數中&#xff0c;就實現了子傳父消息 import { useState } from reactimport { use…

OpenWrt 安裝Quagga 支持ospf Bgp等動態路由協議 軟路由實測 系列四

1 Quagga 是一個路由軟件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的實現. 2 web 登錄安裝 #或者ssh登錄安裝 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登錄 #重啟服務 /etc/init.d/quagga restart #…

使用kubesphere部署微服務的時候,節點的鏡像不是最新的導致部署到舊版本問題

我使用kubesphere部署微服務的時候&#xff0c;發現有很多次&#xff0c;我修改了配置文件&#xff0c;但是部署完才發現部署的是舊版本。 然后我查看了該微服務部署在哪個節點上&#xff1a; kubectl get pods --all-namespaces -o wide例如 gulimall-gateway 這個服務&…

韭菜的自我總結

韭菜的自我總結 股市技術面量價關系左側右側右側技術左側技術洗盤 韭菜的自我修養虛擬貨幣的啟示韭菜的買入時機韭菜的心理壓力成為優秀玩家的關鍵 股市技術面 技術面分析可以作為買賣時機判定的工具&#xff0c;但是投資還是需要基本面的分析作為支撐。也就是基本面選股&…

langchain進階一:特殊的chain,輕松實現對話,與數據庫操作,抽取數據,以及基于本地知識庫的問答

特殊的chain langchain中的Chain有很多,能夠輕松實現部分需求,極致簡化代碼,但是實現效果與模型智慧程度有關 會話鏈 效果與LLMChain大致相同 javascript 復制代碼 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…

Spring Boot中如何實現定時任務?

在項目開發中&#xff0c;經常需要編寫定時任務來實現一些功能&#xff1a; 定時備份數據庫、定時發送郵件、定時清理數據、定時提醒或通知、信用卡每月還款提醒 未支付的訂單15分鐘之后自動取消、未確認收貨的訂單7天之后自動確認收貨 定時任務的實現&#xff1a; Spring T…

Redis 實戰 - 緩存異常及解決方案

文章目錄 概述一、緩存穿透1.1 緩存穿透是什么1.2 解決方案 二、緩存擊穿2.1 緩存擊穿是什么2.2 解決方案 三、緩存雪崩3.1 緩存雪崩是什么3.2 解決方案 四、拓展4.1 緩存預熱4.2 緩存降級 五、結語 把今天最好的表現當作明天最新的起點……&#xff0e;&#xff5e; 概述 在實…

YoloV8改進策略:Neck層改進、注意力改進|HCANet全局與局部的注意力模塊CAFM|二次創新|即插即用

yolov9-c summary: 620 layers, 52330674 parameters, 0 gradients, 245.5 GFLOPsClass Images Instances P R mAP50 mAP50-95: 100%|██████████| 15/15 00:06all 230 1412 0.917 0.985 0.99 0.735…

實現自動化巡檢多臺交換機并將輸出信息保存到文本文件中

為了實現自動化巡檢多臺交換機并將輸出信息保存到文本文件中,可以擴展之前的 SSHInspectionTool 類,使其能夠處理多臺交換機的連接和命令執行。我們可以使用多線程來并行處理多個 SSH 連接,以提高效率。 目錄 一、導入依賴包 二、編寫Java類 (1)SSH.java (2)SSHIns…

LeetCode 第131場雙周賽個人題解

100309. 求出出現兩次數字的 XOR 值 原題鏈接 求出出現兩次數字的 XOR 值 - 力扣 (LeetCode) 競賽 思路分析 簽到題&#xff0c;一次遍歷 AC代碼 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

Python基礎學習筆記(七)——元組

目錄 一、一維元組的介紹、創建與修改二、組合的基本操作1. 遍歷2. 取長度3. 取最值4. 打包5. 批處理5.1 map()函數5.2 lambda 表達式5.3 lambda 表達式 map()函數 一、一維元組的介紹、創建與修改 元組&#xff08;tuple&#xff09;&#xff0c;一種不可變、有序、可重復的數…

SpringBoot如何開啟注解的形式,使用Redis Cache

Spring Cache 是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單的添加注解&#xff0c;就能實現緩存功能。 Spring Cache 提供了一層抽象&#xff0c;底層可以切換不同的緩存實現&#xff0c;例如&#xff1a;Redis、EHCache、Caffeine等 步驟&#xf…

【大模型】Spring AI對接ChatGpt使用詳解

目錄 一、前言 二、spring ai介紹 2.1 什么是Spring AI 2.2 Spring AI 特點 2.3 Spring AI 為開發帶來的便利 2.4 Spring AI應用領域 2.4.1 聊天模型 2.4.2 文本到圖像模型 2.4.3 音頻轉文本 2.4.4 嵌入大模型使用 2.4.5 矢量數據庫支持 2.4.6 用于數據工程ETL框架 …

2024-05-22 VS2022使用modules

點擊 <C 語言編程核心突破> 快速C語言入門 VS2022使用modules 前言一、準備二、使用其一, 用VS installer 安裝模塊:第二個選項就是, 與你的代碼一同編譯std模塊, 這個非常簡單, 但是也有坑. 總結 前言 要解決問題: 使用VS2022開啟modules. 想到的思路: 跟著官方文檔整…

Java進階學習筆記19——內部類

1、 內部類&#xff1a; 是類中五大成分之一&#xff08;成員變量、方法、構造函數、內部類、代碼塊&#xff09;&#xff0c;如果一個類定義在另一個 類的內部&#xff0c;這個類就是內部類。 場景&#xff1a;當一個類的內部&#xff0c;包含了一個完整的事物&#xff0c;且…

Android ART 虛擬機簡析

源碼基于&#xff1a;Android U 1. prop 名稱選項名稱heap 變量名稱功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虛擬機在啟動時&#xff0c;向系統申請的起始內存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 應用可使用的 max…