Java實(shí)例講解反射機(jī)制是怎么一回事
Java反射機(jī)制的概述
1.Java的反射(reflection) :機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個(gè)類的對(duì)象,可以了解任意一個(gè)對(duì)象所屬的類,可以了解任意一個(gè)類的成員變量和方法,可以調(diào)用任意一個(gè)對(duì)象的屬性和方法。這種動(dòng)態(tài)獲取程序信息以及動(dòng)態(tài)調(diào)用對(duì)象的功能稱為Java語(yǔ)言的反射機(jī)制。反射被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射讓Java成為一個(gè)準(zhǔn)動(dòng)態(tài)語(yǔ)言 。缺點(diǎn)增加不安全性。
2.動(dòng)態(tài)語(yǔ)言(弱類型語(yǔ)言) 是運(yùn)行時(shí)才確定數(shù)據(jù)類型的語(yǔ)言,變量在使用之前無(wú)需申明類型,通常變量的值是被賦值的那個(gè)值的類型。. 比如Php、Asp、JavaScript、Python、Perl等等。. 靜態(tài)語(yǔ)言(強(qiáng)類型語(yǔ)言) 是編譯時(shí)變量的數(shù)據(jù)類型就可以確定的語(yǔ)言,大多數(shù)靜態(tài)語(yǔ)言要求在使用變量之前必須生命數(shù)據(jù)類型。. 比如Java、C、C++、C#等。. 弱類型語(yǔ)言 是數(shù)據(jù)類型可以被忽略的語(yǔ)言。
3.靜態(tài)語(yǔ)言是在編譯時(shí)變量的數(shù)據(jù)類型即可確定的語(yǔ)言,多數(shù)靜態(tài)類型語(yǔ)言要求在使用變量之前必須聲明數(shù)據(jù)類型。 例如:C++、Java、Delphi、C#等。 動(dòng)態(tài)語(yǔ)言是在運(yùn)行時(shí)確定數(shù)據(jù)類型的語(yǔ)言。
4.Class類:是描述類的一個(gè)類。Class 類是在Java語(yǔ)言中定義一個(gè)特定類的實(shí)現(xiàn)。一個(gè)類的定義包含成員變量,成員方法,還有這個(gè)類實(shí)現(xiàn)的接口,以及這個(gè)類的父類。Class類的對(duì)象用于表示當(dāng)前運(yùn)行的 Java 應(yīng)用程序中的類和接口。 比如:每個(gè)數(shù)組均屬于一個(gè) Class 類對(duì)象,所有具有相同元素類型和維數(shù)的數(shù)組共享一個(gè)Class 對(duì)象?;镜?Java 類型(boolean, byte, char, short,int, long, float 和 double) 和 void 類型也可表示為 Class 對(duì)象。
理解Class類并獲取Class實(shí)列

類的加載與ClassLoader
Class c1 = Class.forName("com.fianl_.reflection_.pojo");
Class c2 = Class.forName("com.fianl_.reflection_.pojo");
Class c3 = Class.forName("com.fianl_.reflection_.pojo");
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());運(yùn)行結(jié)果如下:

結(jié)論:c1.c2.c3.的hashCode一樣 說(shuō)明一個(gè)類在內(nèi)存中只有一個(gè)Class對(duì)象。一個(gè)類被加載后,類的整個(gè)結(jié)構(gòu)會(huì)被封裝在Class對(duì)象中
Class一些常用的方法:
getName()
一個(gè)Class對(duì)象描述了一個(gè)特定類的屬性,Class類中最常用的方法getName以 String 的形式返回此 Class 對(duì)象所表示的實(shí)體(類、接口、數(shù)組類、基本類型或 void)名稱。
newInstance()
Class還有一個(gè)有用的方法可以為類創(chuàng)建一個(gè)實(shí)例,這個(gè)方法叫做newInstance()。例如:x.getClass.newInstance(),創(chuàng)建了一個(gè)同x一樣類型的新實(shí)例。newInstance()方法調(diào)用默認(rèn)構(gòu)造器(無(wú)參數(shù)構(gòu)造器)初始化新建對(duì)象。
getClassLoader()
返回該類的類加載器。
getComponentType()
返回表示數(shù)組組件類型的 Class。
getSuperclass()
返回表示此 Class 所表示的實(shí)體(類、接口、基本類型或 void)的超類的 Class。
isArray()
判定此 Class 對(duì)象是否表示一個(gè)數(shù)組類。
getClassLoader()
/******************************************************************/
獲取該類的類裝載器。getComponentType()
如果當(dāng)前類表示一個(gè)數(shù)組,則返回表示該數(shù)組組件的Class對(duì)象,否則返回null。
getConstructor(Class[])
返回當(dāng)前Class對(duì)象表示的類的指定的公有構(gòu)造子對(duì)象。
getConstructors()
返回當(dāng)前Class對(duì)象表示的類的所有公有構(gòu)造子對(duì)象數(shù)組。
getDeclaredConstructor(Class[])
返回當(dāng)前Class對(duì)象表示的類的指定已說(shuō)明的一個(gè)構(gòu)造子對(duì)象。
getDeclaredConstructors()
返回當(dāng)前Class對(duì)象表示的類的所有已說(shuō)明的構(gòu)造子對(duì)象數(shù)組。
getDeclaredField(String)
返回當(dāng)前Class對(duì)象表示的類或接口的指定已說(shuō)明的一個(gè)域?qū)ο蟆?/p>
getDeclaredFields()
返回當(dāng)前Class對(duì)象表示的類或接口的所有已說(shuō)明的域?qū)ο髷?shù)組。
getDeclaredMethod(String,Class[])
返回當(dāng)前Class對(duì)象表示的類或接口的指定已說(shuō)明的一個(gè)方法對(duì)象。
getDeclaredMethods()
返回Class對(duì)象表示的類或接口的所有已說(shuō)明的方法數(shù)組。
getField(String)
返回當(dāng)前Class對(duì)象表示的類或接口的指定的公有成員域?qū)ο蟆?/p>
getFields()
返回當(dāng)前Class對(duì)象表示的類或接口的所有可訪問(wèn)的公有域?qū)ο髷?shù)組。
getInterfaces()
返回當(dāng)前對(duì)象表示的類或接口實(shí)現(xiàn)的接口。
getMethod(String,Class[])
返回當(dāng)前Class對(duì)象表示的類或接口的指定的公有成員方法對(duì)象。
getMethods()
返回當(dāng)前Class對(duì)象表示的類或接口的所有公有成員方法對(duì)象數(shù)組,包括已聲明的和從父類繼承的方法。
getModifiers()
返回該類或接口的Java語(yǔ)言修改器代碼。
getName()
返回Class對(duì)象表示的類型(類、接口、數(shù)組或基類型)的完整路徑名字符串。
getResource(String)
按指定名查找資源。
getResourceAsStream(String)
用給定名查找資源。
getSigners()
獲取類標(biāo)記。
getSuperclass()
如果此對(duì)象表示除Object外的任一類,那么返回此對(duì)象的父類對(duì)象。
isArray()
如果Class對(duì)象表示一個(gè)數(shù)組則返回true,否則返回false。
isAssignableFrom(Class)
判定Class對(duì)象表示的類或接口是否同參數(shù)指定的Class表示的類或接口相同,或是其父類。
isInstance(Object)
此方法是Java語(yǔ)言instanceof操作的動(dòng)態(tài)等價(jià)方法。
isInterface()
判定指定的Class對(duì)象是否表示一個(gè)接口類型。
isPrimitive()
判定指定的Class對(duì)象是否表示一個(gè)Java的基類型。
newInstance()
創(chuàng)建類的新實(shí)例。
toString()
將對(duì)象轉(zhuǎn)換為字符串。
獲取Class類的三種方法
- 1.知道具體的類,通過(guò)類的class的屬性獲取,該方法最安全可靠,性能最高
Class a2=pojo.class;
System.out.println(a2.hashCode());- 2.知道一個(gè)類的實(shí)例,調(diào)用實(shí)例的getClass()方法獲取Class對(duì)象
pojo pojo = new pojo();
Class a1=pojo.getClass();
System.out.println(a1.hashCode());- 3.知道一個(gè)類的全名,并且該類在類路徑下,可通過(guò)Class類的靜態(tài)方法forName()獲取,可能拋出 ClassNotFoundException異常
Class c1 = Class.forName("com.fianl_.reflection_.pojo");
System.out.println(c1.hashCode());運(yùn)行代碼:
Class c1 = Class.forName("com.fianl_.reflection_.pojo");
System.out.println(c1.hashCode());
//.知道一個(gè)類的實(shí)例,調(diào)用實(shí)例的getClass()方法獲取Class對(duì)象
pojo pojo = new pojo();
Class a1=pojo.getClass();
System.out.println(a1.hashCode());
//知道具體的類,通過(guò)類的class的屬性獲取,該方法最安全可靠,性能最高
Class a2=pojo.class;
System.out.println(a2.hashCode());結(jié)果:

到此這篇關(guān)于Java實(shí)例講解反射機(jī)制是怎么一回事的文章就介紹到這了,更多相關(guān)Java 反射機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java如何使用ftp下載遠(yuǎn)程服務(wù)器文件
Java通過(guò)FTP下載文件主要有兩種方式:第一種是直接在連接中包含賬號(hào)和密碼進(jìn)行遠(yuǎn)程下載;第二種是登錄后使用賬號(hào)和密碼進(jìn)行下載,這些方法適用于需要從遠(yuǎn)程服務(wù)器獲取文件的場(chǎng)景2024-11-11
java使用wait()和notify()線程間通訊的實(shí)現(xiàn)
Java 線程通信是將多個(gè)獨(dú)立的線程個(gè)體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,本文就介紹了java使用wait()和notify()線程間通訊的實(shí)現(xiàn),感興趣的可以了解一下2023-09-09
Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件
這篇文章主要介紹了Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造
Service Mesh這個(gè)“熱”詞是2016年9月被“造”出來(lái),而今年2018年更是被稱為service Mesh的關(guān)鍵之年,各家大公司都希望能在這個(gè)思潮下領(lǐng)先一步2023-03-03
Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
本篇文章中主要介紹了Spring中的兩種代理JDK和CGLIB的區(qū)別淺談,詳解的介紹了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下2017-04-04
使用?EasyCode生成springboot+mybatis基礎(chǔ)程序的實(shí)現(xiàn)示例
本文主要介紹了使用?EasyCode生成springboot+mybatis基礎(chǔ)程序的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
springboot上傳zip包并解壓至服務(wù)器nginx目錄方式
這篇文章主要介紹了springboot上傳zip包并解壓至服務(wù)器nginx目錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

