一文詳解Java反射

文章目錄

  • 反射是什么?
  • 反射的作用
  • 所有方法匯總
  • 一、加載Class對象
  • 二、加載類的構造器對象
  • 三、加載類的成員變量
  • 四、加載類的成員方法


反射是什么?

反射就是:加載類,并允許以編程的方式解剖類中的某個成分(成員變量,方法,構造器等)
反射需要學什么

  1. 反射第一步:加載類,獲取類的字節碼:Class對象
  2. 獲取類的構造器:Constructor對象
  3. 獲取類的成員變量:Field對象
  4. 獲取類的成員方法:Method對象

在反射中,最重要的就是Class對象,之后的一切操作都是根據Class對象來操作的

反射的作用

  • 基本作用:可以得到一個類的全部成分然后操作

  • 可以破壞封裝性

  • 適合做Java的框架,主流的框架會基于反射設計出一些通用的功能

一下測試代碼我只提供了一個方法,需要源代碼的在這里:反射代碼

所有方法匯總

在這里插入圖片描述

一、加載Class對象

獲取Class對象的三種方法

  • Class c1 = 類名.class
  • 調用Class提供方法:public static Class forName(String Package);
  • Object提供的方法:public Class getClass(); Class c3 = 對象.getClass();
    /*** 測試三種方式得到的Class的三種方法* @throws ClassNotFoundException*/@Testpublic void testEquals() throws ClassNotFoundException {Class s1 = Class.forName("com.wk.reflect.Student");Class s2 = Student.class;Student student = new Student();Class s3 = student.getClass();System.out.println(s1 == s2);   //trueSystem.out.println(s2 == s3);   //trueSystem.out.println(s1 == s3);   //true}

二、加載類的構造器對象

加載構造器對象的步驟:

  • 獲取類的Class對象
  • 調用方法獲得構造器對象
  • 使用:創建一個對象實例newInstance()

獲取構造器的方法如下

方法說明
Constructor<?>[] getConstructors()獲取全部構造器(只能獲取public修飾)
Constructor<?>[] getDeclaredConstructors()獲取全部構造器(任意修飾都可以拿到)
Constructor getConstructor(Class<?>… parameterTypes)獲取某個構造器(只能能獲取public修飾)
Constructor getDeclaredConstructor(Class<?>… parameterTypes)獲取某個構造器(任意修飾都可以拿到)
Constructor提供的方法說明
T newInstance(Object… initargs調用此構造器對象表示的構造器,并傳入參數,完成對象的初始化并返回
public void setAccessible(boolean flag)設置為True,表示禁止加內存訪問控制(暴力反射)
    @Testpublic void testAll() throws Exception {//獲得一個Class對象Class<Student> s1 = Student.class;//獲取一個構造器//這里將無參構造器設置為private的,但是這個也可以獲取Constructor<Student> constructor = s1.getDeclaredConstructor();  //無參構造器是private的,所以需要暴力反射constructor.setAccessible(true);   Student stu = constructor.newInstance();System.out.println(stu);}
--------------輸出---------------
無參構造器執行...
Student{age=0, name='null'}

三、加載類的成員變量

加載成員變量對象的步驟:

  • 獲取類的Class對象
  • 調用方法獲得成員變量對象
  • 使用:調用成員變量對象的get()/set()方法

獲取構成員變量的方法如下

方法說明
public Field[] getFields()獲取類的全部成員變量(只能獲取public修飾的)
public Field[] getDeclaredFields()獲取類的全部成員變量(任意修飾都可以拿到)
public Field getField(String name)獲取類的某個成員變量(只能獲取public修飾的)
public Field getDeclaredField(String name)獲取類的某個成員變量(任意修飾都可以拿到)
方法說明
void set(Object obj, Object value);賦值
Object get(Object obj)取值
public void setAccessible(boolean flag)設置為true,表示禁止檢查訪問控制(暴力反射)
    @Testpublic void testAllField() throws Exception {Class<Student> student = Student.class;//單個時輸入變量名Field age = student.getDeclaredField("age");Student student1 = new Student();age.setAccessible(true);age.set(student1,18);System.out.println(student1);}
------------輸出--------------
無參構造器執行...
Student{age=18, name='null'}

四、加載類的成員方法

加載成員方法對象的步驟:

  • 獲取類的Class對象
  • 調用方法獲得成員方法對象
  • 使用:調用成員方法對象的invoke()方法
方法
Method[] getMethods()獲取類的全部成員變量(只能獲取public修飾的)
Method[] getDeclaredMethods()獲取類的全部成員變量(任意修飾都可以拿到)
Method getMethod(String name, Class<?>… parameterTypes)獲取類的某個成員變量(只能獲取public修飾的)
Method getDeclaredMethod(String name, Class<?>… parameterTypes)獲取類的某個成員變量(任意修飾都可以拿到)
Mehode提供的方法說明
public Object invoke(Object obj, Object… args)觸發某個對象的該方法執行
public void setAccessible(boolean flag)設置為true,表示禁止檢查訪問控制(暴力反射)
    @Testpublic void testAllMethod() throws Exception {Class<Animal> animal = Animal.class;//參數為方法的名稱Method declaredMethod = animal.getDeclaredMethod("eat");declaredMethod.setAccessible(true);Animal animal1 = new Animal();Object invoke = declaredMethod.invoke(animal1);//返回值為nullSystem.out.println(invoke);}
-----------輸出--------------
動物吃
null

完結~

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

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

相關文章

實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景 在該實戰中&#xff0c;我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務&#xff0c;實現一個視頻上傳與展示的應用。具體需求如下&#xff1a; Java應用負責上傳視頻和圖片資源到Nginx目錄下&#xff0c;作為資源服務器。Nginx服務作為靜態…

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 &#x1f334;序言&#x1f340;前置?作&#xff1a;配置掃描路徑&#x1f384;添加注解存儲 Bean 對象&#x1f333;類注解&#x1f6a9;為什么要這么多類注解&#x1f6a9;注解之間的聯系 &#x1f38b;?法注解 Bean&#x1f6a9;?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能&#xff1b;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型&#xff1b;MLLM&#xff1b;LLM&#xff1b;Agent&#xff1b;Llama2&#xff1b;國產GPU芯片&#xff1b;GPU;CPU&#xff1b;高性能計算機&#xff1b;邊緣計算&#xff1b;大模型顯存占用&#xff1b;5G…

如何夸張孩子

你剛才很努力啊&#xff01;——表揚努力盡管艱難&#xff0c;但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多&#xff01;——表揚細節這個方法真有新意&#xff01;——表揚創意你和小伙伴合作得真棒&#xff01;——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現&#xff1a;國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定&#xff0c;從上個月 17 號開始&#xff0c;凡是公司主體在中國的顯卡品牌&#xff0c;就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往&#xff0c;在主要城市有不少畫廊&#xff0c;對經營者來說&#xff0c;不同于銷售行業&#xff0c;其更多的是打造品牌吸引用戶前來或合作等形式&#xff0c;而由于行業特殊性&#xff0c;需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息&#xff0c;例如個人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保護的電子健康信息&#xff08;ePHI&#xff09;和知識產權&#xff08;IP&#xff09;&#xff0c;數據保護措施不足的組織會在…

10-Hadoop組件開發技術

單選題 題目1&#xff1a;下列選項描述錯誤的是&#xff1f; 選項: A Hadoop HA即集群中包含Secondary NameNode作為備份節點存在。 B ResourceManager負責的是整個Yarn集群資源的監控、分配和管理工作 C NodeManager負責定時的向ResourceManager匯報所在節點的資源使用情況…

Spark---DataFrame存儲、Spark UDF函數、UDAF函數

四、DataFrame存儲Spark UDF函數 1、儲存DataFrame 1&#xff09;、將DataFrame存儲為parquet文件 2&#xff09;、將DataFrame存儲到JDBC數據庫 3&#xff09;、將DataFrame存儲到Hive表 2、UDF&#xff1a;用戶自定義函數 可以自定義類實現UDFX接口 java&#xff1a; …

案例062:基于微信小程序的健身房私教預約系統

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

模塊式雨水調蓄池施工簡單,無需大型機械,可實現當天開挖當天回填

模塊式雨水調蓄池的施工過程非常簡單&#xff0c;無需大型機械和繁瑣的施工工藝。在施工過程中&#xff0c;只需要進行簡單的開挖和回填即可&#xff0c;而且可以在當天完成。這種施工方式不僅節省了施工時間和成本&#xff0c;還可以避免因大型機械和繁瑣工藝引起的安全隱患。…

MIT_線性代數筆記: 復習一

目錄 問題一問題二問題三問題四 本講為考前復習課&#xff0c;考試范圍就是 Axb 這個單元&#xff0c;重點是長方形矩陣&#xff0c;與此相關的概念包括零空間、左零空間、秩、向量空間、子空間&#xff0c;特別是四個基本子空間。當矩陣為可逆的方陣時&#xff0c;很多性質是一…

二叉樹的層次遍歷

102. 二叉樹的層序遍歷 - 力扣&#xff08;LeetCode&#xff09; 題目描述 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 樣例輸入 示例 1&#xff1a; 輸入&#xff1a;root [3…

php研究課題

對于PHP這門語言而言&#xff0c;可以研究的課題有很多&#xff0c;以下是可能的課題方向和對應的內容&#xff1a; PHP語言基礎研究 PHP語言特性和基本語法PHP的數據類型、變量、運算符和表達式PHP的流程控制語句PHP的函數和引用PHP的面向對象編程和設計模式 PHP與Web開發 …

harmony開發之Text組件的使用

TextInput、TextArea是輸入框組件&#xff0c;通常用于響應用戶的輸入操作&#xff0c;比如評論區的輸入、聊天框的輸入、表格的輸入等&#xff0c;也可以結合其它組件構建功能頁面&#xff0c;例如登錄注冊頁面。 圖片來源黑馬程序員 Text組件的使用&#xff1a; 文本顯示組…

flutter學習-day1-環境搭建和啟動第一個項目

&#x1f4da; 目錄 SDK 下載配置環境變量安裝 flutter搭建 Android 環境SDK 和依賴升級IDE 配置與使用 Android Studio 配置與使用VS Code 配置與使用 真機調試 本文學習和引用自《Flutter實戰第二版》&#xff1a;作者&#xff1a;杜文 1. SDK下載 前置需要操作系統 window …

Spring Cloud + Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺

Spring Cloud Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺 4-1 使用vue cli創建admin項目 Vue 簡介 Vue作者尤雨溪在google工作時&#xff0c;最早只想研究angular的數據綁定功能&#xff0c;后面覺得這個小功能很好用&#xff0c;有前景&#xff0c;就再擴展&#xff…

[MySQL] MySQL復合查詢(多表查詢、子查詢)

前面我們學習了MySQL簡單的單表查詢。但是我們發現&#xff0c;在很多情況下單表查詢并不能很好的滿足我們的查詢需求。本篇文章會重點講解MySQL中的多表查詢、子查詢和一些復雜查詢。希望本篇文章會對你有所幫助。 文章目錄 一、基本查詢回顧 二、多表查詢 2、1 笛卡爾積 2、2…

機器學習筆記 - 基于深度學習計算視頻中演員的出鏡時間

一、基本步驟 這里是使用動畫片貓和老鼠進行計算,基本流程如下: 1、導入并讀取視頻,從中提取幀,并將其另存為圖像 2、標記一些圖像以訓練模型(別擔心,我已經為你做好了) 3、根據訓練數據構建我們的模型 4、對剩余圖像進行預測 5、計算湯姆和杰瑞的屏幕時間 二、基礎環境…