最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 反射機(jī)制的實(shí)例詳解

 更新時間:2017年10月15日 11:33:20   作者:子沐阿  
這篇文章主要介紹了Java 反射機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握反射機(jī)制,需要的朋友可以參考下

Java 反射機(jī)制的實(shí)例詳解

前言

今天介紹下Java的反射機(jī)制,以前我們獲取一個類的實(shí)例都是使用new一個實(shí)例出來。那樣太low了,今天跟我一起來學(xué)習(xí)學(xué)習(xí)一種更加高大上的方式來實(shí)現(xiàn)。

正文

Java反射機(jī)制定義

Java反射機(jī)制是指在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。 用一句話總結(jié)就是反射可以實(shí)現(xiàn)在運(yùn)行時可以知道任意一個類的屬性和方法。

反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)

為什么要用反射機(jī)制?直接創(chuàng)建對象不就可以了嗎,這就涉及到了動態(tài)與靜態(tài)的概念

靜態(tài)編譯:在編譯時確定類型,綁定對象,即通過。

動態(tài)編譯:運(yùn)行時確定類型,綁定對象。動態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多態(tài)的應(yīng)用,有以降低類之間的藕合性。

優(yōu)點(diǎn)

可以實(shí)現(xiàn)動態(tài)創(chuàng)建對象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開發(fā)中它的靈活性就表現(xiàn)的十分明顯。比如,一個大型的軟件,不可能一次就把把它設(shè)計的很完美,當(dāng)這個程序編譯后,發(fā)布了,當(dāng)發(fā)現(xiàn)需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態(tài)的話,需要把整個程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載,只需要在運(yùn)行時才動態(tài)的創(chuàng)建和編譯,就可以實(shí)現(xiàn)該功能。

缺點(diǎn)

對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。

理解Class類和類類型

想要了解反射首先理解一下Class類,它是反射實(shí)現(xiàn)的基礎(chǔ)。

類是java.lang.Class類的實(shí)例對象,而Class是所有類的類(There is a class named Class) 對于普通的對象,我們一般都會這樣創(chuàng)建和表示:

Code code1 = new Code(); 

上面說了,所有的類都是Class的對象,那么如何表示呢,可不可以通過如下方式呢:

Class c = new Class(); 

但是我們查看Class的源碼時,是這樣寫的:

private Class(ClassLoader loader) { 
classLoader = loader; 
} 

可以看到構(gòu)造器是私有的,只有JVM可以創(chuàng)建Class的對象,因此不可以像普通類一樣new一個Class對象,雖然我們不能new一個Class對象,但是卻可以通過已有的類得到一個Class對象,共有三種方式,如下:

Class c1 = Code.class; 

這說明任何一個類都有一個隱含的靜態(tài)成員變量class,這種方式是通過獲取類的靜態(tài)成員變量class得到的

Class c2 = code1.getClass(); 

code1是Code的一個對象,這種方式是通過一個類的對象的getClass()方法獲得的

Class c3 = Class.forName(“com.trigl.reflect.Code”); 

這種方法是Class類調(diào)用forName方法,通過一個類的全量限定名獲得 ,這里,c1、c2、c3都是Class的對象,他們是完全一樣的,而且有個學(xué)名,叫做Code的類類型(class type)。 這里就讓人奇怪了,前面不是說Code是Class的對象嗎,而c1、c2、c3也是Class的對象,那么Code和c1、c2、c3不就一樣了嗎?為什么還叫Code什么類類型?這里不要糾結(jié)于它們是否相同,只要理解類類型是干什么的就好了,顧名思義,類類型就是類的類型,也就是描述一個類是什么,都有哪些東西,所以我們可以通過類類型知道一個類的屬性和方法,并且可以調(diào)用一個類的屬性和方法,這就是反射的基礎(chǔ)。

舉個簡單例子代碼:

public class ReflectDemo { 
public static void main(String[] args) throws ClassNotFoundException { 
//第一種:Class c1 = Code.class; 
Class class1=ReflectDemo.class; 
System.out.println(class1.getName());

  //第二種:Class c2 = code1.getClass();
  ReflectDemo demo2= new ReflectDemo();
  Class c2 = demo2.getClass();
  System.out.println(c2.getName());

  //第三種:Class c3 = Class.forName("com.trigl.reflect.Code");
  Class class3 = Class.forName("com.tengj.reflect.ReflectDemo");
  System.out.println(class3.getName());
}
} 

執(zhí)行結(jié)果:

com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo 
com.tengj.reflect.ReflectDemo 

Java反射相關(guān)操作

前面我們知道了怎么獲取Class,那么我們可以通過這個Class干什么呢?

總結(jié)如下:

獲取成員方法Method
獲取成員變量Field
獲取構(gòu)造函數(shù)Constructor

下面來具體介紹

獲取成員方法信息

單獨(dú)獲取某一個方法是通過Class類的以下方法獲得的:

public Method getDeclaredMethod(String name, Class c){

}

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • java中的類為什么只能用public修飾?

    java中的類為什么只能用public修飾?

    這篇文章主要介紹了java中的類為什么只能用public修飾,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 一文帶你吃透Java中的String類

    一文帶你吃透Java中的String類

    在 Java 中,字符串是一種常見的數(shù)據(jù)類型,經(jīng)常用于存儲一些文本信息,而String類則是Java提供的專門用于字符串操作的類,本文就來和大家聊聊String類的常用方法與實(shí)現(xiàn)原理吧
    2023-05-05
  • SpringBoot 策略模式實(shí)現(xiàn)切換上傳文件模式

    SpringBoot 策略模式實(shí)現(xiàn)切換上傳文件模式

    策略模式是指有一定行動內(nèi)容的相對穩(wěn)定的策略名稱,這篇文章主要介紹了SpringBoot 策略模式 切換上傳文件模式,需要的朋友可以參考下
    2023-11-11
  • Java?MethodHandles介紹與反射對比區(qū)別詳解

    Java?MethodHandles介紹與反射對比區(qū)別詳解

    這篇文章主要為大家介紹了Java?MethodHandles介紹與反射對比區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 淺談Spring如何解決循環(huán)依賴的問題

    淺談Spring如何解決循環(huán)依賴的問題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)

    Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)

    方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件,需要的朋友可以參考下
    2023-02-02
  • SpringBoot的reload加載器的方法

    SpringBoot的reload加載器的方法

    本篇文章主要介紹了SpringBoot的reload加載器的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 一篇文章帶你Java Spring開發(fā)入門

    一篇文章帶你Java Spring開發(fā)入門

    這篇文章主要為大家詳細(xì)介紹了Java Spring開發(fā)入門學(xué)習(xí)教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • SpringBoot2.x的依賴管理配置

    SpringBoot2.x的依賴管理配置

    這篇文章主要介紹了SpringBoot2.x的依賴管理配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring Boot 集成 Quartz 使用Cron 表達(dá)式實(shí)現(xiàn)定時任務(wù)

    Spring Boot 集成 Quartz 使用Cron 表達(dá)式實(shí)現(xiàn)定

    本文介紹了如何在SpringBoot項目中集成Quartz并使用Cron表達(dá)式進(jìn)行任務(wù)調(diào)度,通過添加Quartz依賴、創(chuàng)建Quartz任務(wù)、配置任務(wù)調(diào)度以及啟動項目,可以實(shí)現(xiàn)定時任務(wù)的執(zhí)行,Cron表達(dá)式提供了靈活的任務(wù)調(diào)度方式,適用于各種復(fù)雜的定時任務(wù)需求,感興趣的朋友一起看看吧
    2025-03-03

最新評論

扶风县| 衡阳市| 江都市| 策勒县| 横山县| 保德县| 郴州市| 疏附县| 辽阳市| 璧山县| 清原| 荣成市| 千阳县| 新河县| 胶南市| 江北区| 拉萨市| 泽普县| 友谊县| 双鸭山市| 六枝特区| 琼结县| 鄯善县| 台南县| 无棣县| 开远市| 澄江县| 阳朔县| 江华| 永登县| 砀山县| 荥经县| 阳朔县| 图木舒克市| 定襄县| 湖口县| 伊通| 察雅县| 鄄城县| 马鞍山市| 郑州市|