Java SE:反射

反射作用

獲取字節碼文件里面的所有信息,包括構造方法、成員、成員方法,以及修飾他們的修飾符、類型和方法的返回值等等,只要是類里面的內容都能獲取,獲取之后可以動態的調用方法,動態的創建對象

獲取類字節碼文件對象

通過該對象可進行獲取構造方法、成員、成員方法等操作?

 //獲取Class對象的三種方法//方法一:通過調用Class類里面的靜態方法獲取(包名 + 類名)Class<?> class1 = Class.forName("a01CreatReflect.Student");System.out.println(class1);//方法二:通過字節碼文件獲取Class<Student> class2 = Student.class;System.out.println(class2);//方法三:通過類實例化后通過實列化對象獲取ClassStudent student = new Student();Class<? extends Student> class3 = student.getClass();System.out.println(class3);

?獲取構造方法?

declare可以獲取到所有(包括私有)的構造方法,而沒有declare修飾的只能獲取公共的?

?獲取成員

?

declare可以獲取到所有(包括私有)的成員,而沒有declare修飾的只能獲取公共的??

獲取成員方法?

?

declare修飾的將獲取該類的所有方法(包括權限不夠大的方法)?

?

沒有declare修飾的連該類繼承的父類,以及實現的接口的公共方法都能獲取到?

?應用場景

?獲取一個實例化對象的所有信息,并將他存進文件

 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IOException {//練習1:獲取字節碼文件里面的成員信息并保存進文件Student s = new Student("zhangsan", 19, "睡覺");Teacher t = new Teacher("niubi", 26);//獲取字節碼文件對象saveObj(s);}public static void saveObj(Object o) throws ClassNotFoundException, IllegalAccessException, IOException {//獲取當前對象的字節碼文件對象Class<?> aClass = o.getClass();//創建高級字符輸出流對象BufferedWriter bw = new BufferedWriter(new FileWriter("Reflect\\a.txt"));//字符串對象//通過字節碼文件對象獲取該字節碼里面的所有成員變量并保存進文件Field[] fields = aClass.getDeclaredFields();for (Field field : fields) {StringBuilder sb = new StringBuilder();field.setAccessible(true);//獲取成員變量的名字String name = field.getName();//獲取成員變量的值Object value = field.get(o);StringBuilder append = sb.append(name + "=" + value);bw.write(append.toString());bw.newLine();}bw.close();}

?無需修改源碼,實現調用不同類的方法

 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//練習2:不用修改代碼,只需修改配置文件實現運行其他類的方法//反射:從文件中獲取內容進行操作Properties p = new Properties();//把文件內容全部加載進集合pp.load(new InputStreamReader(new FileInputStream("Reflect\\a.txt")));System.out.println(p);//獲取配置文件中的類名和方法名String method = p.getProperty("method");String classname = p.getProperty("Classname");System.out.println(method);System.out.println(classname);//創建字節碼文件對象Class aClass = Class.forName(classname);//通過字節碼文件創建對象//1.獲取空參構造Constructor con = aClass.getDeclaredConstructor();//暴力反射:臨時將構造方法的權限擴至最大con.setAccessible(true);//2.通過空參構造創建該類對象Object o = con.newInstance();//3.該對象調用方法(獲取要調用的方法)Method m = aClass.getDeclaredMethod(method);//暴力反射:臨時將方法的權限擴至最大m.setAccessible(true);m.invoke(o);}

?動態代理

當一個項目已經上線運營時,而需求發生變化,需要新功能,若直接修改源碼(侵入式修改)需要重新測試,發布新版本等等操作很老告,?而動態代理的可以省去一堆繁瑣的步驟

動態代理步驟:創建代理對象,代理對象調用要代理的方法

?

?

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

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

相關文章

2024全國水科技大會暨新材料在水污染防治中的應用論壇(十)

召集人&#xff1a;唐 量 上海大學環境與化學工程學院教授 莊贊勇 福州大學材料科學與工程學院教授 一、會議背景 為積極應對“十四五”期間我國生態環境治理面臨的挑戰&#xff0c;加快生態環境科技創新&#xff0c;構建綠色技術創新體系&#xff0c;全面落實科學技術部、生…

創建hadoop集群

分布式hadoop集群分布 服務器功能規劃 node-1&#xff1a;namenode,datanode,nodemanager,historyserver node-2&#xff1a;resourcemanage,datanode,nodemanager node-3&#xff1a;datanode&#xff0c;nodemanager&#xff0c;secondarynamenode #在node-1上 $ bin/hdfs …

點云數據結構化與體素化理論學習

一、PCD點云數據存儲格式的進一步認識 &#xff08;一&#xff09;PCD點云存儲格式相較于其它存儲格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的優勢[1] &#xff08;1&#xff09;具有存儲和處理有組織的點云數據集的能力&#xff0c;這對于實時應用和增強現實及機器…

20240302-1-ZooKeeper面試題(三)

21. 集群最少要幾臺機器&#xff0c;集群規則是怎樣的? 集群規則為 2N1 臺&#xff0c;N>0&#xff0c;即 3 臺。 22. 集群支持動態添加機器嗎&#xff1f; 其實就是水平擴容了&#xff0c;Zookeeper 在這方面不太好。兩種方式&#xff1a;第 62 頁 共 485 頁全部重啟&a…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之非包裝類型

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之非包裝類型 一、未包裝類型映射二、未包裝類型字段名三、查詢未包裝對象3.1 按未包裝字段排序3.2 未包裝對象的字段投影3.3 未包裝對象的Query By Example3.4 未包裝對象的存儲庫查詢 四、更新未包裝對象五、未包裝對象…

蒼穹外賣學習 Day10 Day11 Day12

前言 用于記錄蒼穹外賣Day10、Day11、Day12的學習 Day10 訂單狀態定時處理 來電提醒 客戶催單 訂單狀態定時處理 Spring Task Spring Task是一個任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯&#xff08;定時自動執行某段Java代碼&#xff09; cron表…

代碼隨想錄算法訓練營第三十天| 回溯篇總結

文章目錄 前言一、組合問題二、切割問題三、子集問題四、排列問題五、性能分析總結 前言 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 組合問題&#xff1a;N個數里面按一定規則找出k個數的集合 排列問題&#xff1a;N個數按一定規則全…

【黑馬程序員】STL之set和map容器

文章目錄 set/multiset容器set基本概念簡介區別 set的構造和賦值功能描述函數原型代碼示例運行結果 set的大小和交換功能描述函數原型代碼示例運行結果 set的插入和刪除功能描述函數原型代碼示例運行結果 set查找和統計函數原型代碼示例運行結果 set和multiset區別區別代碼示例…

JVM(6)

JMM JVM定義了一種Java內存模型來屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平臺下都能達到一致的內存訪問效果.在此之前,C/C直接使用物理硬件和操作系統的內存模型,因此,會由于不同平臺下的內存模型差異,有可能導致程序在一套平臺上并發完全正常,而在另…

深入解剖指針(4)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a; 我要學編程(?_?)-CSDN博客 目錄 回調函數 qsort使用舉例 使用qsort函數排序整型數據 使用qsort排序結構數據 qsort函數的模擬實現 回調函數 回調函數就是一個通過函數指…

【Android12】Android性能調優工具SystemServerTiming日志

Android性能調優工具SystemServerTiming日志 性能優化、穩定性優化是Android系統優化的兩大方面&#xff0c;對于性能調試Android提供了很多工具&#xff0c;比如&#xff1a;bootchart、systrace、perfboot、log、dmsg等等。 SystemServerTiming是Android原生系統中一個日志…

《Spring Security 簡易速速上手小冊》第10章 未來趨勢與高級話題(2024 最新版)

文章目錄 10.1 云原生安全性趨勢10.1.1 基礎知識10.1.2 重點案例&#xff1a;保護微服務通信10.1.3 拓展案例 1&#xff1a;容器安全最佳實踐10.1.4 拓展案例 2&#xff1a;自動化安全審計和合規性檢查 10.2 反應式編程與 Spring Security10.2.1 基礎知識10.2.2 重點案例&#…

nginx-圖片模塊

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 訪問: 1234…

CSS錐形漸變:conic-gradient()

畫一個扇形圖&#xff0c;使用常規方法可能很難畫&#xff0c;但是用錐形漸變的話非常好畫 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

Git分布式版本控制系統——git學習準備工作

一、Git倉庫介紹 開發者可以通過Git倉庫來存儲和管理文件代碼&#xff0c;Git倉庫分為兩種&#xff1a; 本地倉庫&#xff1a;開發人員自己電腦上的Git倉庫 遠程倉庫&#xff1a;遠程服務器上的Git倉庫 倉庫之間的運轉如下圖&#xff1a; commit&#xff1a;提交&#xff…

Decoupled Knowledge Distillation解耦知識蒸餾

Decoupled Knowledge Distillation解耦知識蒸餾 現有的蒸餾方法主要是基于從中間層提取深層特征&#xff0c;而忽略了Logit蒸餾的重要性。為了給logit蒸餾研究提供一個新的視角&#xff0c;我們將經典的KD損失重新表述為兩部分&#xff0c;即目標類知識蒸餾&#xff08;TCKD&a…

c++之旅——第四彈

大家好啊&#xff0c;這里是c之旅第三彈&#xff0c;跟隨我的步伐來開始這一篇的學習吧&#xff01; 如果有知識性錯誤&#xff0c;歡迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 創作不易&#xff0c;希望大家多多支持哦&#xff01; 本篇文章的主…

如何對比 MySQL 主備數據的一致性?

隨著業務范圍的擴大&#xff0c;很多企業為了保障核心業務的高可用性&#xff0c;選擇了 MySQL 主從架構&#xff0c;這一套方案通常具備主備數據同步、數據備份與恢復、讀寫分離、高可用切換等特性&#xff0c;是一種相當成熟可靠的數據庫架構方案。然而這套方案在特定情況下可…

Redis小白入門教程

Redis入門教程 1. Redis入門1.1 Redis簡介1.2 Redis服務啟動與停止1.2.1 Redis下載1.2.2 服務啟動命令1.2.3 客戶端連接命令1.2.4 修改Redis配置文件 2. Redis數據類型2.1 五種常用數據類型介紹2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

雙周回顧#006 - 這三個月

斷更啦~~ 上次更新時間 2023/11/23, 斷更近三個月的時間。 先狡辯下&#xff0c;因為忙、著實忙。因為忙&#xff0c;心安理得給斷更找了個借口&#xff0c;批評下自己~~ 這三個月在做啥&#xff1f;跨部門援助&#xff0c;支援公司互聯網的 ToC 項目&#xff0c;一言難盡。 …