欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)例講解反射機(jī)制是怎么一回事

 更新時(shí)間:2022年03月04日 15:35:08   作者:笑霸final  
Java的反射(reflection)機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個(gè)類的對(duì)象,可以了解任意一個(gè)對(duì)象所屬的類,可以了解任意一個(gè)類的成員變量和方法,可以調(diào)用任意一個(gè)對(duì)象的屬性和方法

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語言的反射機(jī)制。反射被視為動(dòng)態(tài)語言的關(guān)鍵,反射讓Java成為一個(gè)準(zhǔn)動(dòng)態(tài)語言 。缺點(diǎn)增加不安全性。

2.動(dòng)態(tài)語言(弱類型語言) 是運(yùn)行時(shí)才確定數(shù)據(jù)類型的語言,變量在使用之前無需申明類型,通常變量的值是被賦值的那個(gè)值的類型。. 比如Php、Asp、JavaScript、Python、Perl等等。. 靜態(tài)語言(強(qiáng)類型語言) 是編譯時(shí)變量的數(shù)據(jù)類型就可以確定的語言,大多數(shù)靜態(tài)語言要求在使用變量之前必須生命數(shù)據(jù)類型。. 比如Java、C、C++、C#等。. 弱類型語言 是數(shù)據(jù)類型可以被忽略的語言。

3.靜態(tài)語言是在編譯時(shí)變量的數(shù)據(jù)類型即可確定的語言,多數(shù)靜態(tài)類型語言要求在使用變量之前必須聲明數(shù)據(jù)類型。 例如:C++、Java、Delphi、C#等。 動(dòng)態(tài)語言是在運(yùn)行時(shí)確定數(shù)據(jù)類型的語言。

4.Class類:是描述類的一個(gè)類。Class 類是在Java語言中定義一個(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一樣 說明一個(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)造器(無參數(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ì)象表示的類的指定已說明的一個(gè)構(gòu)造子對(duì)象。

getDeclaredConstructors()

返回當(dāng)前Class對(duì)象表示的類的所有已說明的構(gòu)造子對(duì)象數(shù)組。

getDeclaredField(String)

返回當(dāng)前Class對(duì)象表示的類或接口的指定已說明的一個(gè)域?qū)ο蟆?/p>

getDeclaredFields()

返回當(dāng)前Class對(duì)象表示的類或接口的所有已說明的域?qū)ο髷?shù)組。

getDeclaredMethod(String,Class[])

返回當(dāng)前Class對(duì)象表示的類或接口的指定已說明的一個(gè)方法對(duì)象。

getDeclaredMethods()

返回Class對(duì)象表示的類或接口的所有已說明的方法數(shù)組。

getField(String)

返回當(dāng)前Class對(duì)象表示的類或接口的指定的公有成員域?qū)ο蟆?/p>

getFields()

返回當(dāng)前Class對(duì)象表示的類或接口的所有可訪問的公有域?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語言修改器代碼。

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語言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.知道具體的類,通過類的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è)類的全名,并且該類在類路徑下,可通過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());
        //知道具體的類,通過類的class的屬性獲取,該方法最安全可靠,性能最高
        Class a2=pojo.class;
        System.out.println(a2.hashCode());

結(jié)果:

到此這篇關(guān)于Java實(shí)例講解反射機(jī)制是怎么一回事的文章就介紹到這了,更多相關(guān)Java 反射機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring cloud hystrix 超時(shí)時(shí)間使用方式詳解

    spring cloud hystrix 超時(shí)時(shí)間使用方式詳解

    這篇文章主要介紹了spring cloud hystrix 超時(shí)時(shí)間使用方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Spring?Data?JPA框架快速入門之自定義Repository接口

    Spring?Data?JPA框架快速入門之自定義Repository接口

    Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問和操作,本篇我們來了解Spring?Data?JPA框架的自定義Repository接口
    2022-04-04
  • SpringBoot超詳細(xì)講解多數(shù)據(jù)源集成

    SpringBoot超詳細(xì)講解多數(shù)據(jù)源集成

    今天分享下SpringBoot多數(shù)據(jù)源集成,我怕麻煩,這里我覺得我的集成也應(yīng)該是最簡單的,清晰明了
    2022-05-05
  • Java如何獲取數(shù)組和字符串的長度(length還是length())

    Java如何獲取數(shù)組和字符串的長度(length還是length())

    這篇文章主要介紹了Java如何獲取數(shù)組和字符串的長度(length還是length()),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaMail實(shí)現(xiàn)發(fā)送郵件(QQ郵箱)

    JavaMail實(shí)現(xiàn)發(fā)送郵件(QQ郵箱)

    這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)發(fā)送郵件(QQ郵箱),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java開啟新線程并傳參方法代碼實(shí)現(xiàn)

    Java開啟新線程并傳參方法代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java開啟新線程并傳參方法代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java中struts 框架的實(shí)現(xiàn)

    java中struts 框架的實(shí)現(xiàn)

    本文給大家介紹的是java中struts 框架的實(shí)現(xiàn),有需要的小伙伴可以參考下。
    2015-06-06
  • SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    這篇文章主要為大家詳細(xì)介紹了SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程,文中的示例代碼講解詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來,java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細(xì)節(jié),需要的朋友可以參考下
    2023-12-12
  • Springboot整合Socket實(shí)現(xiàn)單點(diǎn)發(fā)送,廣播群發(fā),1對(duì)1,1對(duì)多實(shí)戰(zhàn)

    Springboot整合Socket實(shí)現(xiàn)單點(diǎn)發(fā)送,廣播群發(fā),1對(duì)1,1對(duì)多實(shí)戰(zhàn)

    本文主要介紹了Springboot整合Socket實(shí)現(xiàn)單點(diǎn)發(fā)送,廣播群發(fā),1對(duì)1,1對(duì)多實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論