亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java反射機(jī)制詳解

 更新時(shí)間:2022年09月20日 10:49:20   作者:Array_new  
Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類,都可以知道這個(gè)類的所有屬性和方法,對(duì)于任何一個(gè)對(duì)象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息,這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為Java的反射機(jī)制

什么是反射?

反射是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為 Java 語言的反射機(jī)制。

哪里用到反射機(jī)制

JDBC中,利用反射動(dòng)態(tài)加載了數(shù)據(jù)庫驅(qū)動(dòng)程序。

Web服務(wù)器中利用反射調(diào)用了Sevlet的服務(wù)方法。

Eclispe等開發(fā)工具利用反射動(dòng)態(tài)刨析對(duì)象的類型與結(jié)構(gòu),動(dòng)態(tài)提示對(duì)象的屬性和方法。

很多框架都用到反射機(jī)制,注入屬性,調(diào)用方法,如Spring。

動(dòng)態(tài)代理是什么

有哪些應(yīng)用?

動(dòng)態(tài)代理是運(yùn)行時(shí)動(dòng)態(tài)生成代理類。

動(dòng)態(tài)代理的應(yīng)用有 Spring AOP數(shù)據(jù)查詢、測(cè)試框架的后端 mock、rpc,Java注解對(duì)象獲取等。

怎么實(shí)現(xiàn)動(dòng)態(tài)代理

JDK 原生動(dòng)態(tài)代理和 cglib 動(dòng)態(tài)代理。

JDK 原生動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的,而 cglib 是基于繼承當(dāng)前類的子類實(shí)現(xiàn)的。

Java反射機(jī)制的作用

在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類

在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象

在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法

在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法

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

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

  • 能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例,大大提高系統(tǒng)的靈活性和擴(kuò)展性。
  • 與 Java 動(dòng)態(tài)編譯相結(jié)合,可以實(shí)現(xiàn)無比強(qiáng)大的功能。
  • 對(duì)于 Java 這種先編譯再運(yùn)行的語言,能夠讓我們很方便的創(chuàng)建靈活的代碼,這些代碼可以在運(yùn)行時(shí)裝配,無需在組件之間進(jìn)行源代碼的鏈接,更加容易實(shí)現(xiàn)面向?qū)ο蟆?/li>

缺點(diǎn):

  • 反射會(huì)消耗一定的系統(tǒng)資源,因此,如果不需要?jiǎng)討B(tài)地創(chuàng)建一個(gè)對(duì)象,那么就不需要用反射;
  • 反射調(diào)用方法時(shí)可以忽略權(quán)限檢查,獲取這個(gè)類的私有方法和屬性,因此可能會(huì)破壞類的封裝性而導(dǎo)致安全問題。

如何使用Java的反射

通過一個(gè)全限類名創(chuàng)建一個(gè)對(duì)象

Class.forName(“全限類名”); 例如:com.mysql.jdbc.Driver Driver類已經(jīng)被加載到 jvm中,并且完成了類的初始化工作就行了

類名.class; 獲取Class<?> clz 對(duì)象

對(duì)象.getClass();

獲取構(gòu)造器對(duì)象,通過構(gòu)造器new出一個(gè)對(duì)象

Clazz.getConstructor([String.class]);

Con.newInstance([參數(shù)]);

通過class對(duì)象創(chuàng)建一個(gè)實(shí)例對(duì)象(就相當(dāng)與new類名()無參構(gòu)造器)

Cls.newInstance();

通過class對(duì)象獲得一個(gè)屬性對(duì)象

Field c=cls.getFields():獲得某個(gè)類的所有的公共(public)的字段,包括父類中的字段。

Field c=cls.getDeclaredFields():獲得某個(gè)類的所有聲明的字段,即包括public、private和proteced,但是不包括父類的聲明字段

通過class對(duì)象獲得一個(gè)方法對(duì)象

Cls.getMethod(“方法名”,class……parameaType);(只能獲取公共的)

Cls.getDeclareMethod(“方法名”);(獲取任意修飾的方法,不能執(zhí)行私有)

M.setAccessible(true);(讓私有的方法可以執(zhí)行)

讓方法執(zhí)行

Method.invoke(obj實(shí)例對(duì)象,obj可變參數(shù));-----(是有返回值的)

//測(cè)試類
public class Demo {
    public String name;
    public void inputAndoutput {
        BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String aa;
        while ( !(aa= br.readLine()).equals("bye")){
            bufferedWriter.write(aa);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
        br.close();
        bufferedWriter.close();
    }
    public Demo(){
    }
    public void print(){
    	System.out.println(this.name);
    }
    public void reverseWords(String s) {
    	System.out.println(s);
		return s;
    }
}
//利用反射
  Class c=new Demo().getClass();
        System.out.println(c.toString());
        Class[] classes=c.getClasses();
        for (Class ca:classes){
            System.out.println(ca.toString());
        }
        Arrays.stream(c.getFields()).forEach(s->{
            System.out.println(s.toString());
        });

到此這篇關(guān)于Java反射機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java反射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea創(chuàng)建項(xiàng)目沒有webapp文件夾的解決方法

    idea創(chuàng)建項(xiàng)目沒有webapp文件夾的解決方法

    本文主要介紹了idea創(chuàng)建項(xiàng)目沒有webapp文件夾的解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • mybatis中 if-test 數(shù)字判斷的坑及解決

    mybatis中 if-test 數(shù)字判斷的坑及解決

    這篇文章主要介紹了mybatis中 if-test 數(shù)字判斷的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 深入淺出了解happens-before原則

    深入淺出了解happens-before原則

    一提到happens-before原則,就讓人有點(diǎn)“丈二和尚摸不著頭腦”。這個(gè)涵蓋了整個(gè)JMM中可見性原則的規(guī)則,究竟如何理解,把我個(gè)人一些理解記錄下來。下面可以和小編一起學(xué)習(xí)
    2019-05-05
  • 淺談@RequestParam(required = true)的誤區(qū)

    淺談@RequestParam(required = true)的誤區(qū)

    這篇文章主要介紹了@RequestParam(required = true)的誤區(qū),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • idea版本更新安裝教程詳解

    idea版本更新安裝教程詳解

    idea的更新版本比較特殊,需要重新安裝一下,這篇文章給大家介紹idea版本更新安裝教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-11-11
  • SpringBoot獲取配置文件的簡(jiǎn)單實(shí)現(xiàn)方法

    SpringBoot獲取配置文件的簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取配置文件的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • java基礎(chǔ)知識(shí)之FileInputStream流的使用

    java基礎(chǔ)知識(shí)之FileInputStream流的使用

    這篇文章主要介紹了java基礎(chǔ)知識(shí)之FileInputStream流的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之查找

    Java數(shù)據(jù)結(jié)構(gòu)之查找

    本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中查找的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • Spring Bean的生命周期詳細(xì)介紹

    Spring Bean的生命周期詳細(xì)介紹

    這篇文章主要介紹了Spring Bean的生命周期的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 詳解Java多線程和IO流的應(yīng)用

    詳解Java多線程和IO流的應(yīng)用

    這篇文章主要介紹了詳解Java多線程和IO流的應(yīng)用,無論是本地文件復(fù)制,還是網(wǎng)絡(luò)多線程下載,對(duì)于流的使用都是一樣的,需要的朋友可以參考下
    2023-04-04

最新評(píng)論