java中Reflection反射(一)

目錄

一、概述

二、class類:

1、獲取類的字節碼文件:

(1)方式一:直接通過一個class的靜態變量class獲取

(2)方式二:如果知道一個class的完整類名,可以通過靜態方法Class.forName()獲取

(3)方式三:通過具體對象的getClass方法獲取

2、Class.newInstance()通過字節碼文件對象創建具體類的實例:(此類中必須有無參構造方法)

3、Class常用的方法:

三、調用構造方法

1、getConstructors() 獲取所有被public修飾的構造方法

2、getDeclaredConstructors()獲取所有的構造方法(不受訪問修飾符限制)

3、getConstructor()獲取某個指定的被public修飾的構造方法

4、getDeclaredConstructor 獲取指定的某個構造方法 可以給泛型

5、解剖構造方法

(1)getModifiers():獲取構造方法的權限修飾符:包訪問修飾符-0 public-1 private-2 protected-4

(2)setAccessible(true):臨時取消權限校驗符

四、獲取繼承關系:

1、getSuperclass():獲取該類繼承的類,返回Class對象

2、getlnterfaces():獲取該類實現的所有接口,返回Class 型數組

五、訪問字段

1、獲取成員變量:

(1)getFields()獲取所有的被public修飾的成員變量(包含父類的成員變量)

(2)getDeclaredFields()獲取所有本類中的成員變量(包含私有的等)

(3)getField()獲取本類中或者父類中的某個被public修飾的成員變量

(4)getDeclaredField()獲取本類中的某個成員變量

2、解剖成員變量:

(1)getModifiers():獲取權限修飾符

(2)getType():獲取數據類型

(3)getName():獲取變量名

3、應用:

(1)get(Object? ?o):獲取對象中此成員變量的值:

(2)set(Object? ?o, Object? Value)設置對象中此成員變量的值

(3)注意事項:靜態成員變量不依賴于對象,靜態成員變量共享一片空間,所以可以不傳入對象,直接修改修改


一、概述

? ?Java 反射機制是 Java 語言的一個重要特性。在學習 Java 反射機制前,大家應該先了解兩個概念:編譯期和運行期。

編譯期:是指把源碼交給編譯器編譯成計算機可以執行的文件的過程。在 Java 中也就是把 Java 代碼編成 class 文件的過程。編譯期只是做了一些翻譯功能,并沒有把代碼放在內存中運行起來,而只是把代碼當成文本進行操作。比如:檢查語法錯誤。

運行期:是把編譯后的文件交給計算機執行,直到程序運行結束。所謂運行期就把在磁盤中的代碼放到內存中執行起來。

? ? ? ?Java 反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為 Java 語言的反射機制。簡單來說,反射機制指的是程序在運行時能夠獲取自身的信息。在 Java 中,只要給定類的名字,就可以通過反射機制來獲得類的所有信息。

Java 反射機制在服務器程序和中間件程序中得到了廣泛運用。在服務器端,往往需要根據客戶的請求,動態調用某一個對象的特定方法或者為屬性賦值。例如:在主流的 ORM 框架的實現中,運用 Java 反射機制可以讀取任意一個 JavaBean 的所有屬性,或者給這些屬性賦值。

Java 反射機制主要提供了以下功能,這些功能都位于java.lang.reflect包。

  • 在運行時判斷任意一個對象所屬的類。
  • 在運行時構造任意一個類的對象。
  • 在運行時判斷任意一個類所具有的成員變量和方法。
  • 在運行時調用任意一個對象的方法。
  • 生成動態代理。

二、class類:

? ? ? 要想知道一個類的屬性和方法,必須先獲取到該類的字節碼文件對象。獲取類的信息時,使用的就是 Class 類中的方法。所以先要獲取到每一個字節碼文件(.class)對應的 Class 類型的對象.class(包括interface)的本質是數據類型(Type)。class是由JVM在執行過程中動態加載的。JVM在第一次讀取到一種class類型時,將其加載進內存。每加載一種classJVM就為其創建一個Class類型的實例,并關聯起來。

注意:這里的Class類型是一個名叫Classclass。

1、獲取類的字節碼文件:

(1)方式一:直接通過一個class的靜態變量class獲取
 //方式一:直接通過一個class的靜態變量class獲取Class clazz1=Person.class;System.out.println(clazz1);
(2)方式二:如果知道一個class的完整類名,可以通過靜態方法Class.forName()獲取
//方式二:如果知道一個class的完整類名,可以通過靜態方法Class.forName()獲取Class clazz2=Class.forName("com.yuan.reflection.Person");System.out.println(clazz2);
(3)方式三:通過具體對象的getClass方法獲取
  //方式三:通過具體對象的getClass方法獲取Person p1=new Person();Class clazz3=p1.getClass();System.out.println(clazz3);

2、Class.newInstance()通過字節碼文件對象創建具體類的實例:(此類中必須有無參構造方法)

 //通過Class.newInstance()可以創建類的實例,要求實例必須要有公共的無參構造方法,否則報錯Object p2 = clazz1.newInstance();System.out.println(p2);

3、Class常用的方法:

類型

訪問方法

返回值類型

說明

包路徑

getPackage()

Package 對象

獲取該類的存放路徑

類名稱

getName()

String 對象

獲取該類的名稱

繼承類

getSuperclass()

Class 對象

獲取該類繼承的類

實現接口

getlnterfaces()

Class 型數組

獲取該類實現的所有接口

構造方法

getConstructors()

Constructor 型數組

獲取所有權限為 public 的構造方法

getDeclaredContruectors()

Constructor 對象

獲取當前對象的所有構造方法

方法

getMethods()

Methods 型數組

獲取所有權限為 public 的方法

getDeclaredMethods()

Methods 對象

獲取當前對象的所有方法

成員變量

getFields()

Field 型數組

獲取所有權限為 public 的成員變量

getDeclareFileds()

Field 對象

獲取當前對象的所有成員變量

三、調用構造方法

1、getConstructors() 獲取所有被public修飾的構造方法

2、getDeclaredConstructors()獲取所有的構造方法(不受訪問修飾符限制)

3、getConstructor()獲取某個指定的被public修飾的構造方法

4、getDeclaredConstructor 獲取指定的某個構造方法 可以給泛型

5、解剖構造方法

(1)getModifiers():獲取構造方法的權限修飾符:包訪問修飾符-0 public-1 private-2 protected-4
(2)setAccessible(true):臨時取消權限校驗符
public class Demo04 {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//1、獲取類的字節碼文件對象Class<Person> clazz = Person.class;//2、獲取構造方法//getConstructors() 獲取所有被public修飾的構造方法
//        Constructor[] cons = clazz.getConstructors();
//        for (Constructor con:cons) {
//            System.out.println(con);
//        }//getDeclaredConstructors()獲取所有的構造方法(不受訪問修飾符限制)Constructor[] cons = clazz.getDeclaredConstructors();for (Constructor con:cons) {System.out.println(con);}//getConstructor()獲取某個指定的被public修飾的構造方法Constructor con = clazz.getConstructor();System.out.println(con);//getDeclaredConstructor 獲取指定的某個構造方法   可以給泛型Constructor<Person> con1=clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con1);//3、解剖//包-0 public-1 private-2 protected-4int modifier = con1.getModifiers();System.out.println(modifier);System.out.println("權限修飾符是否是公共的"+Modifier.isPublic(modifier));Parameter[] parameters = con1.getParameters();for (Parameter p:parameters) {System.out.println(p.getType()+"_"+p.getName());}//4、實例化對象con1.setAccessible(true);//臨時取消權限校驗符Person p1 = con1.newInstance("張三", 13);//注意構造方法要為public,不是公共的需要設置取消臨時校驗符System.out.println(p1);}
}

四、獲取繼承關系:

1、getSuperclass():獲取該類繼承的類,返回Class對象

2、getlnterfaces():獲取該類實現的所有接口,返回Class 型數組

public class Demo03 {public static void main(String[] args) {Class clazz = Person.class;//包路徑 getPackage()  Package對象獲取該類的存放路徑Package pac = clazz.getPackage();System.out.println(pac);//類名稱 getName() String對象 獲取該類的名稱String strName = clazz.getName();System.out.println(strName);//繼承類getSuperclass() Class對象 獲取該類繼承的類Class supclasss = clazz.getSuperclass();System.out.println(supclasss);//實現的接口Class[] cles = clazz.getInterfaces();System.out.println(Arrays.toString(cles));}
}

五、訪問字段

1、獲取成員變量:

(1)getFields()獲取所有的被public修飾的成員變量(包含父類的成員變量)
(2)getDeclaredFields()獲取所有本類中的成員變量(包含私有的等)
(3)getField()獲取本類中或者父類中的某個被public修飾的成員變量
(4)getDeclaredField()獲取本類中的某個成員變量
        Class<Dog> clazz = Dog.class;//2、獲取成員變量
//        //getFields()獲取所有的被public修飾的成員變量(包含父類的成員變量)Field[] fields = clazz.getFields();for (Field f:fields) {System.out.println(f);}//getDeclaredFields()獲取所有本類中的成員變量(包含私有的等)Field[] fields2 = clazz.getDeclaredFields();for (Field f:fields2) {System.out.println(f);}//getField()獲取本類中或者父類中的某個被public修飾的成員變量Field field = clazz.getField("type");System.out.println(field);//getDeclaredField()獲取本類中的某個成員變量Field field = clazz.getDeclaredField("color");System.out.println(field);

2、解剖成員變量:

(1)getModifiers():獲取權限修飾符
(2)getType():獲取數據類型
(3)getName():獲取變量名
        //獲取權限修飾符int modifier = field.getModifiers();System.out.println("權限修飾符為:"+modifier);//獲取數據類型Class typeClass = field.getType();System.out.println("數據類型為:"+typeClass);//獲取變量名String name = field.getName();System.out.println("此成員變量的變量名為:"+name);

3、應用:

(1)get(Object? ?o):獲取對象中此成員變量的值:
(2)set(Object? ?o, Object? Value)設置對象中此成員變量的值
(3)注意事項:靜態成員變量不依賴于對象,靜態成員變量共享一片空間,所以可以不傳入對象,直接修改修改
        Dog d2=new Dog();Dog d1=new Dog("花花",5,"田園犬",20.0,25,"花色");
//        field.setAccessible(true);//臨時取消校驗符
//        //獲取d1對象中此成員變量的值
//        Object obj = field.get(d1);
//        System.out.println("獲取到成員變量type對應對象d1的值"+obj);
//        //設置對象d1中此成員變量的值為黑白
//        field.set(d1,"黑白");
//        System.out.println(d1);//靜態成員變量不依賴于對象field.setAccessible(true);//臨時取消校驗符//獲取靜態成員變量,不依賴于對象二存在,所以獲取此成員變量的值時,可以不傳對象Object obj = field.get(null);System.out.println("獲取到成員變量type對應對象d1的值"+obj);//設置成員變量值,靜態成員變量共享一片空間,所以可以修改field.set(null,"黑白");System.out.println(d1);System.out.println(d2);
public class Animal {public String name;private int age;public Animal(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package com.yuan.reflection;public class Dog extends Animal{public String type;protected double weight;int height;public static String color;public Dog() {super("小白",23);}public Dog(String name, int age, String type, double weight, int height, String color) {super(name, age);this.type=type;this.weight=weight;this.height=height;this.color=color;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", type='" + type + '\'' +", weight=" + weight +", height=" + height +", color=" + color +'}';}
}

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

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

相關文章

CVE-2021-1879

一、漏洞原理 CVE-2021-1879 是 IBM WebSphere Application Server 中存在的一個 路徑遍歷&#xff08;Path Traversal&#xff09; 漏洞&#xff0c;其核心原理為&#xff1a; ①WebSphere 在處理某些文件操作請求&#xff08;如下載、上傳或配置文件讀取&#xff09;時&#…

二進制簽名查找器(Aho-Corasick 自動機):設計思路與實現原理(C/C++代碼實現)

在逆向工程、惡意軟件分析和二進制文件解析領域&#xff0c;快速準確地識別特定字節模式&#xff08;即“簽名”&#xff09;是一項核心任務。本文將圍繞一款基于PE-bear工具的二進制簽名查找器&#xff0c;深入解析其設計思路、實現原理及相關技術背景&#xff0c;揭示其如何高…

後端開發技術教學(二) 條件指令、循環結構、定義函數

書接上回&#xff1a;後端開發技術教學(一) [附2025最新可用 phpstudy2018下載鏈接] -CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 目錄 一、條件指令 1.1 if() …

狀壓DP-基本框架

狀壓DP-基本框架一、狀壓DP的核心思想與適用場景1.1 問題特征1.2 核心思想1.3 與傳統DP的對比二、位運算基礎&#xff1a;狀壓DP的語法三、狀壓DP的基本框架3.1 步驟拆解3.2 通用代碼模板四、經典案例詳解4.1 旅行商問題&#xff08;TSP&#xff09;問題描述狀壓DP設計代碼實現…

Web 端 AI 圖像生成技術的應用與創新:虛擬背景與創意圖像合成

隨著 Stable Diffusion、Midjourney 等生成式 AI 模型的爆發,Web 端圖像生成技術從“實驗室demo”走向“工業化應用”。其中,虛擬背景替換(如視頻會議的動態背景生成)和創意圖像合成(如用戶上傳素材與 AI 生成元素的融合)成為最具代表性的場景,它們通過“文本描述→AI 生…

應急響應知識總結

應急響應 Windows系統 查賬號 1、查看服務器是否有弱口令&#xff0c;遠程管理端口是否對公網開放。 檢查方法&#xff1a;據實際情況咨詢相關服務器管理員。 2、查看服務器是否存在可疑賬號、新增賬號。 檢查方法&#xff1a;打開 cmd 窗口&#xff0c;輸入 lusrmgr.msc …

智慧水務賦能二次供水管理精細化轉型:物聯網驅動的全鏈路解決方案

隨著我國城鎮化率激增&#xff0c;高層建筑占比上升&#xff0c;二次供水系統已成為保障城市供水安全的核心環節。然而&#xff0c;傳統管理模式面臨設備老化、運維粗放、監管缺失等矛盾&#xff0c;在此背景下&#xff0c;《“十四五”節水型社會建設規劃》明確要求推進二次供…

tsmc 5nm lvs之 short難搞的類型

1、M3層以上的層次發生的short&#xff0c;dengsity很高的情況下&#xff0c;兩根信號net導致的short&#xff0c;刪除其中一根然后ecoRoute fix不掉的情況下&#xff0c;該怎么辦&#xff0c;可以嘗試去cut 周圍或者上方的power。 2、M1&#xff0c; M2由于cell 內部出pin&…

初識神經網絡01——認識PyTorch

文章目錄一、認識PyTorch1.1 PyTorch是什么1.2 安裝PyTorch二、認識Tensor2.1 創建Tensor2.1.1 基本方式2.2.2 創建線性和隨機張量2.2 Tensor屬性2.2.1 切換設備2.2.2 類型轉換2.3 Tensor與Numpy的數據轉換2.3.1 張量轉ndarray2.3.2 Numpy轉張量2.4 Tensor常見操作2.4.1 取值2.…

Android UI 組件系列(十一):RecyclerView 多類型布局與數據刷新實戰

博客專欄&#xff1a;Android初級入門UI組件與布局 源碼&#xff1a;通過網盤分享的文件&#xff1a;Android入門布局及UI相關案例 鏈接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取碼: 4k9n 引言 在 Android 應用中&#xff0c;RecyclerView 是最常用…

如何學習跨模態對齊(尤其是 CLIP 思想)

學習跨模態對齊&#xff08;尤其是CLIP思想&#xff09;需要結合理論基礎、經典模型原理、實踐復現和前沿擴展&#xff0c;以下是一套系統的學習路徑&#xff0c;從入門到深入逐步展開&#xff1a; 一、先補基礎&#xff1a;跨模態對齊的“前置知識” 跨模態對齊的核心是讓圖…

日記研究:一種深入了解用戶真實體驗的UX研究方法

在用戶體驗&#xff08;UX&#xff09;研究中&#xff0c;我們常常需要了解用戶在真實世界中如何與產品互動。然而&#xff0c;由于時間和空間的限制&#xff0c;我們很難像“特工”一樣全天候跟蹤用戶。這時&#xff0c;“日記研究”&#xff08;Diary Studies&#xff09;就成…

鴻蒙app 開發中 加載圖片的時候閃一下 如何解決

1.解決 在圖片上 加載這個屬性 .syncLoad(true) 參考的官方鏈接

【OS】進程與線程

進程進程實體代碼段相關數據PCB進程標識符外部標識符&#xff1a;為方便用戶對進程的訪問&#xff0c;為每個進程設置一個外部標識符&#xff0c;通常由字母和數字組成內部標識符&#xff1a;為方便系統對進程的使用&#xff0c;在OS中又為進程設置了內部標識符&#xff0c;賦予…

Django 序列化詳解:從 Model 到 JSON,全面掌握數據轉換機制

一、引言&#xff1a;什么是 Django 序列化&#xff1f;在 Web 開發中&#xff0c;序列化&#xff08;Serialization&#xff09; 是指將復雜的數據結構&#xff08;如數據庫模型對象&#xff09;轉換為可傳輸的格式&#xff08;如 JSON、XML、YAML 等&#xff09;&#xff0c;…

茶葉蛋大冒險小游戲流量主微信抖音小程序開源

游戲特點 響應式設計&#xff1a;完美適配各種移動設備屏幕尺寸 直觀的觸摸控制&#xff1a;左右滑動屏幕控制茶葉蛋移動 中式風格元素&#xff1a; 茶葉蛋角色帶有裂紋紋理和可愛表情 筷子、蒸籠等中式廚房元素作為障礙物 八角、茶葉等香料作為收集物 鍋底火焰動畫效果 游戲機…

區分郵科工業交換機與路由器

在這個數字化的時代&#xff0c;我們每天都在享受著互聯網帶來的便利。無論是工作還是娛樂&#xff0c;網絡已經成為我們生活中不可或缺的一部分。然而&#xff0c;在這個看似簡單的背后&#xff0c;隱藏著兩個至關重要的設備——郵科工業交換機和路由器。它們就像網絡世界的雙…

【數據結構入門】數組和鏈表的OJ題(2)

目錄 1.回文鏈表 分析&#xff1a; 代碼&#xff1a; 2.相交鏈表 分析&#xff1a; 代碼&#xff1a; 3.環形鏈表 分析&#xff1a; 代碼&#xff1a; 面試提問&#xff1a; 4.環形鏈表II 分析1&#xff1a; 分析2&#xff1a; 代碼&#xff1a; 5.隨機鏈表的復…

文件包含篇

web78 第一題filter偽協議直接讀源碼即可 ?filephp://filter/convert.base64-encode/resourceflag.php web79 flag.php的php無法用大小寫繞過&#xff0c;所以用Php://input只讀流 import requests url "http://fadb524a-f22d-4747-a35c-82f71e84bba7.challenge.ctf.sho…

互作蛋白組學技術對比:鄰近標記與傳統IP-MS、Pull down-MS優勢對比

在生命科學領域&#xff0c;蛋白質間的相互作用構成了生命活動的核心網絡&#xff0c;驅動著信號傳導、基因調控、代謝途徑等關鍵過程。為了繪制這幅復雜的“分子互作地圖”&#xff0c;科學家們開發了多種技術&#xff0c;其中免疫共沉淀結合質譜&#xff08;IP-MS&#xff09…