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

一篇文章帶你了解一些Java反射的學(xué)習(xí)記錄

 更新時(shí)間:2021年09月02日 11:08:15   作者:綠芽在山頂  
java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來寫操做數(shù)據(jù)庫的代碼了,這個(gè)可以很大的減少開發(fā)時(shí)間,而且代碼的可讀性好

一、反射概述

  • 反射允許程序在運(yùn)行中獲取類的內(nèi)部信息,例如構(gòu)造器、成員變量、成員方法等
  • 類加載之后,在堆中生成一個(gè)Class類的對象(一個(gè)類只有一個(gè)Class對象),這個(gè)對象包含類的完整結(jié)構(gòu)信息

二、入門案例

通過配置文件中的內(nèi)容生成指定類的對象并調(diào)用指定方法

// re.properties
className=com.javalearn.reflect.Cat
methodName=hi
public class Cat {
    private String name = "招財(cái)貓";
    public void hi() {
        System.out.println("hi:" + this.name);
    }
}
public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        // 1.properties對象加載配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/re.properties"));
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        System.out.println("類名:" + className);
        System.out.println("方法名:" + methodName);
        // 2.根據(jù)類名獲取Class類對象
        //  獲取Class對象的三種方式:
        //      1.類名.class
        //      2.對象.getClass()
        //      3.Class.forName(類名)
        Class cls = Class.forName(className);
        // 3.生成實(shí)例對象
        Object o = cls.newInstance();
        // 4.獲取方法
        Method declaredMethod = cls.getDeclaredMethod(methodName);
        // 5.方法.invoke(對象)
        declaredMethod.invoke(o);
        // 6.反射涉及的其他類
        // 6.1Field成員變量
        Field name = cls.getDeclaredField("name");
        name.setAccessible(true);   //private屬性需暴力反射
        System.out.println(name.get(o));
        // 6.2Constructor構(gòu)造器
        Constructor constructor = cls.getConstructor(); //方法參數(shù)類型與構(gòu)造器的參數(shù)類型一致,不寫就是無參構(gòu)造器
        Object o1 = constructor.newInstance();
        System.out.println(o1);
    }
}

三、反射原理圖

Java程序執(zhí)行的三個(gè)階段

  • 將Java代碼編譯成字節(jié)碼
  • 類加載器加載字節(jié)碼文件,在堆中生成Class類對象
  • 運(yùn)行階段使用Class對象生成真正的Java類

反射可以做哪些事?

在運(yùn)行時(shí):

  • 判斷任一對象所屬的類
  • 構(gòu)造任一類的對象
  • 得到任一類所具有的成員變量和方法
  • 調(diào)用任一對象的成員變量和方法
  • 生成動(dòng)態(tài)代理

四、反射性能測試

反射基本上是解釋執(zhí)行,性能差

public class PerformanceDemo {
    public static void main(String[] args) throws Exception {
        tradition();
        reflect();
    }
    private static void reflect() throws Exception {
        Class cls = Class.forName("com.sankuai.yangjin.javalearn.reflect.Cat");
        Object o = cls.newInstance();
        Method hi = cls.getMethod("hi");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            hi.invoke(o);
        }
        long end = System.currentTimeMillis();
        System.out.println("反射耗時(shí):" + (end - start));
    }
    private static void tradition() {
        Cat cat = new Cat();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            cat.hi();
        }
        long end = System.currentTimeMillis();
        System.out.println("傳統(tǒng)耗時(shí):" + (end - start));
    }
}

優(yōu)化方式:

Method、Field、Constructor對象都有setAccessible()方法,可以將參數(shù)設(shè)置為true,表示在使用反射時(shí)取消訪問檢查,效果也就一般般

五、Class類

  • Class類也是類,繼承Obejct類
  • Class類對象不是new出來的,而是系統(tǒng)創(chuàng)建的
  • 對于某個(gè)類的Class類對象,在內(nèi)存中只有一份,因?yàn)轭愔患虞d一次
  • 每個(gè)類的實(shí)例都知道自己是由哪個(gè)Class實(shí)例生成,對象.getClass()
  • 通過Class對象可以得到類的完整結(jié)構(gòu)
  • Class對象是存放在堆的
  • 類的字節(jié)碼二進(jìn)制數(shù)據(jù)(元數(shù)據(jù))存放在方法區(qū),包括方法代碼、變量名、方法名、訪問權(quán)限等

六、類加載

反射是Java實(shí)現(xiàn)動(dòng)態(tài)語言的關(guān)鍵,通過反射實(shí)現(xiàn)類動(dòng)態(tài)加載

  • 靜態(tài)加載:編譯時(shí)加載相關(guān)的類,如果沒有相關(guān)的類則報(bào)錯(cuò),依賴太強(qiáng)
  • 動(dòng)態(tài)加載:運(yùn)行時(shí)加載需要的類,如果運(yùn)行時(shí)不用該類,那么即使該類不存在也不報(bào)錯(cuò)

將下面一段代碼通過javac 編譯時(shí),因?yàn)椴]有Dog類,所以編譯失??;但當(dāng)前同樣沒有Person類,卻不會(huì)由于沒有Person類而導(dǎo)致編譯失敗,因?yàn)槭莿?dòng)態(tài)加載,當(dāng)出現(xiàn)case "2"時(shí)才會(huì)加載該類

public class LoadDemo {
    public static void main (String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        String num = scanner.next();
        switch (num) {
            case "1":
                // 靜態(tài)加載
                Dog dog = new Dog();
                break;
            case "2":
                // 反射,動(dòng)態(tài)加載
                Class person = Class.forName("Person");
                break;
            default:
        }
    }
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • mybatis-plus中更新null值的問題解決

    mybatis-plus中更新null值的問題解決

    本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析

    關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析

    這篇文章主要給大家介紹了關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 通過Class類獲取對象(實(shí)例講解)

    通過Class類獲取對象(實(shí)例講解)

    下面小編就為大家?guī)硪黄ㄟ^Class類獲取對象(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot和Vue接口如何調(diào)用傳參

    SpringBoot和Vue接口如何調(diào)用傳參

    本文總結(jié)了SpringBoot和Vue.js中接口調(diào)用的常見傳參方式,包括GET、POST請求的參數(shù)傳遞方式,以及SpringBoot中常用的注解進(jìn)行參數(shù)接收的方法,文章詳細(xì)介紹了Axios請求的封裝方法,并提供了一些實(shí)際的代碼示例
    2025-02-02
  • 關(guān)于logBack配置日志文件及編碼配置的問題

    關(guān)于logBack配置日志文件及編碼配置的問題

    這篇文章主要介紹了logBack配置日志文件及編碼配置的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Security基本原理詳解

    Spring Security基本原理詳解

    這篇文章主要介紹了Spring Security基本原理詳解,springsecurity底層實(shí)現(xiàn)為一條過濾器鏈,就是用戶請求進(jìn)來,判斷有沒有請求的權(quán)限,拋出異常,重定向跳轉(zhuǎn),需要的朋友可以參考下
    2023-05-05
  • springboot中報(bào)錯(cuò)Invalid character found in the request的解決

    springboot中報(bào)錯(cuò)Invalid character found in 

    這篇文章主要介紹了springboot中報(bào)錯(cuò)Invalid character found in the request的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Spring 父類變量注入失敗的解決

    Spring 父類變量注入失敗的解決

    這篇文章主要介紹了Spring 父類變量注入失敗的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 關(guān)于Mybatis-Plus?Update更新策略問題

    關(guān)于Mybatis-Plus?Update更新策略問題

    這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java Swing JProgressBar進(jìn)度條的實(shí)現(xiàn)示例

    Java Swing JProgressBar進(jìn)度條的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java Swing JProgressBar進(jìn)度條的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

姚安县| 鸡西市| 吴江市| 棋牌| 平乐县| 泽库县| 蛟河市| 沈丘县| 甘洛县| 庆城县| 子洲县| 日喀则市| 哈巴河县| 榆林市| 临夏市| 大竹县| 神农架林区| 安徽省| 锡林郭勒盟| 军事| 炉霍县| 济源市| 乌兰察布市| 甘南县| 三江| 汕头市| 浮梁县| 丰原市| 洛宁县| 闸北区| 中宁县| 淮阳县| 平利县| 庆云县| 西畴县| 桦甸市| 正阳县| 专栏| 汉寿县| 临洮县| 兴隆县|