一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 一篇文章帶你了解一些Java反射的學習記錄

一篇文章帶你了解一些Java反射的學習記錄

2021-12-15 10:56綠芽在山頂 Java教程

java反射機制是一個很好用的東西,用它可以解決很多死的東西,因為反射機制的靈活行很大,有了他,我們就不要花太多的時間來寫操做數據庫的代碼了,這個可以很大的減少開發時間,而且代碼的可讀性好

一、反射概述

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

二、入門案例

通過配置文件中的內容生成指定類的對象并調用指定方法

?
1
2
3
// re.properties
className=com.javalearn.reflect.Cat
methodName=hi
?
1
2
3
4
5
6
public class Cat {
    private String name = "招財貓";
    public void hi() {
        System.out.println("hi:" + this.name);
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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.根據類名獲取Class類對象
        //  獲取Class對象的三種方式:
        //      1.類名.class
        //      2.對象.getClass()
        //      3.Class.forName(類名)
        Class cls = Class.forName(className);
        // 3.生成實例對象
        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構造器
        Constructor constructor = cls.getConstructor(); //方法參數類型與構造器的參數類型一致,不寫就是無參構造器
        Object o1 = constructor.newInstance();
        System.out.println(o1);
    }
}

三、反射原理圖

Java程序執行的三個階段

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

一篇文章帶你了解一些Java反射的學習記錄

反射可以做哪些事?

在運行時:

  • 判斷任一對象所屬的類
  • 構造任一類的對象
  • 得到任一類所具有的成員變量和方法
  • 調用任一對象的成員變量和方法
  • 生成動態代理

四、反射性能測試

反射基本上是解釋執行,性能差

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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("反射耗時:" + (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("傳統耗時:" + (end - start));
    }
}

優化方式:

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

五、Class類

  • Class類也是類,繼承Obejct類
  • Class類對象不是new出來的,而是系統創建的
  • 對于某個類的Class類對象,在內存中只有一份,因為類只加載一次
  • 每個類的實例都知道自己是由哪個Class實例生成,對象.getClass()
  • 通過Class對象可以得到類的完整結構
  • Class對象是存放在堆的
  • 類的字節碼二進制數據(元數據)存放在方法區,包括方法代碼、變量名、方法名、訪問權限等

六、類加載

反射是Java實現動態語言的關鍵,通過反射實現類動態加載

  • 靜態加載:編譯時加載相關的類,如果沒有相關的類則報錯,依賴太強
  • 動態加載:運行時加載需要的類,如果運行時不用該類,那么即使該類不存在也不報錯

將下面一段代碼通過javac 編譯時,因為并沒有Dog類,所以編譯失敗;但當前同樣沒有Person類,卻不會由于沒有Person類而導致編譯失敗,因為是動態加載,當出現case "2"時才會加載該類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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":
                // 靜態加載
                Dog dog = new Dog();
                break;
            case "2":
                // 反射,動態加載
                Class person = Class.forName("Person");
                break;
            default:
        }
    }
}

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weufengwangshi_/article/details/119985954

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 三体动漫在线观看免费完整版2022 | 精品久久久久久久久久香蕉 | 亚洲国产精品一区二区三区久久 | 国产成人cao在线 | tube4欧美4 | 无人在线视频高清免费播放 | 175m美女被网友灌醉啪啪玩脚 | 韩国女主播一区二区视频 | 欧美精品久久久久久久免费观看 | 日本高清va不卡视频在线观看 | 日韩精品欧美国产精品亚 | 欧美日韩亚洲一区二区三区在线观看 | 日本九九视频 | 2021久久| 欧美人体高清在线观看ggogo | 无遮掩60分钟从头啪到尾 | 国产精品久久久久久久久 | 91久久精品国产一区二区 | 欧美a级v片在线观看一区 | 精品一区二区三区免费观看 | 日日碰碰 | 动漫美女3d被爆漫画 | 日本福利视频一区 | 99热国产在线 | 成人免费观看在线视频 | 8插8插 | 久久AV国产麻豆HD真实 | 好大好湿好硬好爽好深免费视频 | 草莓社区 | 精品人人做人人爽久久久 | vomoulei成人舞蹈 | 天天做日日爱 | 日本老妇和子乱视频 | 胸奶好大好紧好湿好爽 | bnb998八度免费影院丫意浓 | 精精国产xxxx视频在线播放器 | 亚洲人成毛片线播放 | 国产精品区一区二区免费 | 天码毛片一区二区三区入口 | 天堂a免费视频在线观看 | 91香蕉视频在线观看 |