亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java反射的作用是什么

發布時間:2021-10-29 15:49:14 來源:億速云 閱讀:226 作者:iii 欄目:編程語言

這篇文章主要介紹“Java反射的作用是什么”,在日常操作中,相信很多人在Java反射的作用是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java反射的作用是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

01.解釋型語言和編譯型語言

解釋型語言:不需要編譯,在運行的時候逐行翻譯解釋;修改代碼時可以直接修改,可以快速部署,不過性能上會比編譯型語言稍差;比如 JavaScript、Python ;

編譯型語言:需要通過編譯器將源代碼編譯成機器碼才能執行;編譯之后如果需要修改代碼,在執行之前就需要重新編譯。比如 C 語言;

Java 嚴格來說也是編譯型語言,但又介于編譯型和解釋型之間;Java 不直接生成機器碼而是生成中間碼:編譯期間,是將源碼交給編譯器生成 class 文件(字節碼),這個過程中只做了翻譯的工作,并沒有把代碼放入內存運行;當進入運行期,字節碼才被 Java 虛擬機加載、解釋成機器語言并運行。

Java反射的作用是什么

02.動態語言和靜態語言

動態語言:是指程序在運行時可以改變自身結構,在運行時確定數據類型,一個對象是否能執行某操作,只取決于它有沒有對應的方法,而不在乎它是否是某種類型的對象;比如 JavaScript、Python。

靜態語言:相對于動態語言來說,在編譯時變量的數據類型就已經確定(使用變量之前必須聲明數據類型),在編譯時就會進行類型是否匹配;比如 C 語言、Java ;

03.反射的概念

Java 反射機制:在運行過程中,對于任意一個類,都能知道其所有的屬性和方法;對于任意一個對象,都能調用其屬性和方法;這種動態獲取類信息和調用對象方法的功能,就是 Java 反射機制。

既然反射里面有一個“反”字,那么我們先看看何為“正”。

在 Java 中,要使用一個類中的某個方法,“正向”都是這樣的:

ArrayList list = new ArrayList(); //實例化  list.add("reflection");  //執行方法

那么反向(反射)要如何實現?

Class clz = Class.forName("java.util.ArrayList");  Method method_add = clz.getMethod("add",Object.class);  Constructor constructor = clz.getConstructor();  Object object = constructor.newInstance();  method_add.invoke(object, "reflection");  Method method_get = clz.getMethod("get",int.class);  System.out.println(method_get.invoke(object, 0));

兩段代碼執行的結果是一樣的,但是“正向”代碼在編譯前,就已經明確了要運行的類是什么(ArrayList),而第二段代碼,只有在代碼運行時,才知道運行的類是 java.util.ArrayList。

04.反射的作用

講到這里,有些同學可能會有疑問:“反射有什么用?我明明都已經知道了要使用的類是 ArrayList ,我不能直接 new 一個對象然后執行里面的方法么?”

當然可以!不過很多場景中,在代碼運行之前并不知道需要使用哪個類,或者說在運行的時候才決定使用哪個類;

比如有這么一個功能:“調用阿里云的人臉識別 API ”;這還不簡單,參考對方的 API 文檔,很快就能實現。

Java反射的作用是什么

faceRecognition(Object faceImg){    //調用阿里云的人臉識別 API }

上線一個月后,領導說:“咱公司開始和騰訊云合作了,人臉識別的接口改一下吧”。

Java反射的作用是什么

faceRecognition(Object faceImg){    //調用騰訊云的人臉識別 API  }

修改上線運行了兩個月,領導說:“換回來吧”...  ...

當然有聰明的程序員會想到設置一個開關配置,讓開關決定走哪段代碼邏輯,如果領導哪天想變成亞馬遜云的服務,繼續寫 if-else 就好了:

faceRecognition(Object faceImg){    if("AL".equals(configStr)){      //調用阿里云的人臉識別 API    }else if("TX".equals(configStr)){      //調用騰訊云的人臉識別 API    }else if("AM".equals(configStr)){      //調用亞馬遜云的人臉識別 API    }  }

不過還有一種更好的方法:

1. 定義一個接口:

interface FaceRecognitionInterface(){    faceRecognition(Object faceImg) ;  }

2. 多個實現類:

class ALFaceRecognition implements FaceRecognitionInterface{    //調用阿里云的人臉識別 API 的實現  }  class TXFaceRecognition implements FaceRecognitionInterface{    //調用騰訊云的人臉識別 API 的實現  }

3. 在調用人臉識別功能的代碼中:

String configStr = "讀取配置,走阿里云還是騰訊云";  FaceRecognitionInterface faceRe =  Class.forName(configStr).newInstance();  faceRe.faceRecognition(faceImg);

如果上面這個例子,你依然覺得在調用方法中做 if-else 判斷,和使用反射實現并沒有差太多,但是如果程序員 A 提供接口,程序員 B 提供實現,程序員 C 寫客戶端呢?

回憶一下 JDBC 的使用,比如創建一個連接:

public Connection getConnection() throws Exception{    Connection conn = null;    //初始化驅動類    Class.forName("com.mysql.jdbc.Driver");    conn = DriverManager.getConnection("jdbc:mysql://url","root", "admin");    return conn;  }

其中:

  •  程序員 A 提供接口:Oracle 公司(之前的 Sun)提供 JDBC 標準(接口)。

  •  程序員 B 提供實現:各個數據庫廠商提供針對自家數據庫的實現。

  •  程序員 C 寫客戶端:我等碼農在 Java 中敲代碼訪問數據庫。

總結一下Java 反射的作用:可以設計出更為通用和靈活的架構,很多框架為了保證其通用性,可以根據配置加載不用的類,這時候要用到反射。除此之外:

  •  動態代理:在不改變目標對象方法的情況下對方法進行增強,比如使用 AOP 攔截某些方法打印日志,這就需要通過反射執行方法中的內容。

  •  注解:利用反射機制,獲取注解并執行對應的行為。

05.用反射的用法

上文中我們知道了 Java 運行期的源文件是 class 文件(字節碼),所以要使用反射,那么就需要獲取到字節碼文件對象,在 Java 中,獲取字節碼文件對象有三種方式:

  •  調用某個類的 class 屬性:類名.class

  •  調用對象的 getClass() 方法:對象.getClass()

  •  使用 Class 類中的 forName() 靜態方法:Class.forName(類的全路徑) ,建議使用這種方法

java.lang.reflect 類庫提供了對反射的支持:

  •  Field :可以使用 get 和 set 方法讀取和修改對象的屬性;

  •  Method :可以使用 invoke() 方法調用對象中的方法;

  •  Constructor :可以用 newInstance() 創建新的對象。

06.反射的優缺點

優點:在運行時動態獲取類和對象中的內容,極大地提高系統的靈活性和擴展性;夸張一些說,反射是框架設計的靈魂。

缺點:會有一定的性能損耗,JVM 無法對這些代碼進行優化;破壞類的封裝性。

總之,可能大家在平時的開發過程中,感覺自己并沒有寫過反射相關的代碼,但是在我們用到的各種開源框架中,反射無處不在。

到此,關于“Java反射的作用是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石林| 乌鲁木齐市| 商洛市| 化德县| 柳州市| 安康市| 商水县| 宽城| 佛山市| 上蔡县| 平江县| 武宁县| 西乌珠穆沁旗| 静乐县| 民勤县| 大余县| 治多县| 满洲里市| 丰镇市| 唐河县| 迭部县| 津南区| 鄂托克前旗| 平利县| 绥阳县| 莫力| 横山县| 库伦旗| 阿拉善右旗| 义乌市| 龙南县| 卓资县| 凉山| 兴文县| 通城县| 东阳市| 车致| 扶沟县| 维西| 郴州市| 固安县|