面試官這樣問我Java反射原理,我剛好都會

上週我投遞出了簡歷,崗位是java後端開發工程師。這周美團面試官給我進行了面試,面試過程中他問了Java的反射原理。(不得不誇一句,美團的效率真高,上午面完一面,晚上二面馬上安排上了。)

無論什麼Java技術崗位,Java反射原理,在面試中出現的次數很多,所以我面試之前也有所準備,於是今天結合面試問題先詳細講一講Java反射原理

JAVA反射機制

JAVA反射機制是在運行狀態中

對於任意一個類,都能夠知道這個類的所有屬性和方法;

對於任意一個對象,都能夠調用它的任意一個屬性和方法;

這種動態獲取的信息以及動態調用對象的方法的功能稱爲 java語言的反射機制

在這裏插入圖片描述

使用場景

IDE自動提示功能,對象(提示:屬性、方法)

不知道類或者對象的具體信息,應該使用反射來實現。

比如類的名稱放在XML文件中,屬性和屬性值放在XML文件中,需要在運行時讀取XML文件,動態獲取類的信息。

原理

Java在編譯之後會生成一個class文件,反射通過字節碼文件找到其類中的方法和屬性等

功能

在這裏插入圖片描述

關鍵類

在這裏插入圖片描述

Class對象

類型標識,JVM中爲每個對象都保留其類型標識信息。

包含類的所有信息

可以通過該對象獲取到構造方法,成員變量,成員方法和接口等信息

獲取方法:

  • 通過字面量直接獲取,例如XXX.class,不會觸發類的初始化但XXX類已經被加載到方法區。

  • 通過Object類的getClass方法,例如Object.getClass()。觸發類的初始化

  • 通過Class的靜態方法,例如Class.forName()。觸發類的初始化

在這裏插入圖片描述

Field

成員變量,類中的屬性對象。

通過Class類的getDeclaredField()或getDeclaredFields()方法獲取
在這裏插入圖片描述

Field的方法主要分爲兩大類,即getXXX和setXXX

Method

類中的方法對象。包括了靜態方法和成員方法(包括抽象方法在內)。

通過invoke()來完成方法被動態調用的目的。

非靜態變量,需要添加對象參數

在這裏插入圖片描述
在這裏插入圖片描述

setAccessible()方法不影響其他對象和原方法

getDeclaredMethod

可以獲取指定方法名和參數的方法對象 Method

@CallerSensitive
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
    throws NoSuchMethodException, SecurityException {
    checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
    //從返回的方法列表裏找到一個匹配名稱和參數的方法對象。
    Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
    if (method == null) {
        throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
    }
    return method;
}

privateGetDeclaredMethods

從緩存或JVM中獲取該Class中申明的方法列表。

searchMethods

從返回的方法列表裏找到一個匹配名稱和參數的方法對象。

如果找到一個匹配的Method,則重新copy一份返回,即Method.copy()方法。

ReflectionData

用來緩存從JVM中讀取類的如下屬性數據。

Constructor

構造函數。類的構造方法

getConstructor() :獲取匹配的構造方法

在這裏插入圖片描述

步驟:

  1. 先獲取所有的constructors, 然後通過進行參數類型比較;

  2. 找到匹配後,通過 ReflectionFactory,copy一份constructor返回;

  3. 否則拋出 NoSuchMethodException;

父類/父接口

在這裏插入圖片描述

優點

通過反射,java可以動態的加載未知的外部配置對象臨時生成字節碼進行加載使用,使代碼更靈活,極大地提高應用的擴展性。

總結

咱們玩歸玩,鬧歸鬧,別拿面試開玩笑。

Java的反射特性是java的高級特性,在面試中屢屢碰到。面試官問的問題往往都是有關聯性的,一旦問到了,大家一定要回答正確,不要丟三落四,回答到點上。大家面試前要把反射特性的原理、應用場景、功能和關鍵類(Class、Fileds、Methods、Constructor等)熟記。

參考鏈接:https://www.icourse163.org/learn/ECNU-1206500807

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章