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

Java開發(fā)崗位面試被問到反射怎么辦

 更新時間:2021年07月17日 15:12:06   作者:蛋撻學(xué)姐  
這篇文章主要介紹了java 面向?qū)ο竺嬖嚰\的相關(guān)資料,這里整理了面向?qū)ο蟮幕A(chǔ)知識,幫助大家學(xué)習(xí)理解此部分的知識,需要的朋友可以參考下

到底什么是反射呢???

反射的核心就是JVM在運行時才動態(tài)加載類或調(diào)用方法,訪問屬性,它不需要事先(寫代碼的時候或編譯期)知道運行對象是誰。

每一個類都會產(chǎn)生一個對應(yīng)的Class對象,也就是保存在.class文件。

所有類都是在對其第一次使用時,動態(tài)加載到JVM的,當程序創(chuàng)建一個對類的靜態(tài)成員的引用時,就會加載這個類,Class對象僅在需要的時候才會加載,static初始化是在類加載時進行的。

public class TestMain {
    public static void main(String[] args) {
        System.out.println(Test.name); // 對Test類的靜態(tài)成員name引用。
    }
}
class Test {
    public static String name = "Test Name";
    static {
        System.out.println("Test靜態(tài)塊");
    }
    public Test() {
        System.out.println("Test構(gòu)造了");
    }
}

輸出:

Test靜態(tài)塊 Test Name

2. 類的生命周期

一個類編譯完成后,下一步就是開始使用類,怎么使用?

類編譯完成后,開始使用類,在程序執(zhí)行中JVM通過裝載,鏈接,初始化這3個步驟完成。

1.裝載:由類加載器完成,找到對應(yīng)的字節(jié)碼,創(chuàng)建一個Class對象。

類加載器首先會檢查這個類的Class對象是否已經(jīng)被加載過,如果沒有加載,默認的類加載器就會根據(jù)類名查找對應(yīng)的.class文件。

加載器將.class文件的二進制文件裝入JVM的方法區(qū),并且在堆區(qū)創(chuàng)建描述這個類的java.lang.Class對象,用來封裝數(shù)據(jù),但是同一個類只會被類裝載器裝載一次。

2.鏈接:就是把二進制數(shù)據(jù)組裝為可以運行的狀態(tài)

校驗:一般用來確認此二進制文件是否適合當前的JVM(版本)

準備:為靜態(tài)成員分配內(nèi)存空間,并設(shè)置默認值。

解析:轉(zhuǎn)換常量池中的代碼作為直接引用的過程,直到所有的符號都可以被運行程序使用(建立完整的對應(yīng)關(guān)系)驗證類中的字節(jié)碼,為靜態(tài)域分配空間。

3.初始化:如果該類有父類,則對其初始化,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化塊。

3. Java反射框架主要提供以下功能:

在運行時構(gòu)造任意一個類的對象

在運行時調(diào)用任意一個對象的方法

在運行時判斷任意一個對象所屬的類

在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法)

反射的基本用法

1. 獲得Class對象

<1> 使用Class類的forName靜態(tài)方法:

public static Class<?> forName(String className) 
在JDBC開發(fā)中常用此方法加載數(shù)據(jù)庫驅(qū)動: Class.forName(driver);
//加入Java開發(fā)交流君樣:756584822一起吹水聊天

<2> 直接獲取某一個對象的class:(編譯時已知類型名稱或已知對象)

Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;

<3> 調(diào)用某個對象的getClass()方法:

StringBuilder str = new StringBuilder("123");
Class<?> klass = str.getClass();

注意: 使用.class來創(chuàng)建Class對象的引用時,不會自動初始化該Class對象,使用forName(…)會自動初始化該Class對象。

2. 判斷是否為某個類的實類

一般:用instanceof關(guān)鍵字判斷

反射:反射中Class對象的isInstance()方法

public native boolean isInstance(Object obj);

3.創(chuàng)建實例

通過反射來生成對象主要有兩種方式:

<1> 使用Class對象的newInstance()方法來創(chuàng)建Class對象對應(yīng)類的實例。

Class<?> c = String.class;
Object str = c.newInstance();

<2> 先通過Class對象獲取指定的Constructor對象,再調(diào)用Constructor對象的newInstance()方法來創(chuàng)建實例。

// 獲取String所對應(yīng)的Class對象
Class<?> c = String.class;
// 獲取String類帶一個String參數(shù)的構(gòu)造器
Constructor constructor = c.getConstructor(String.class);
// 根據(jù)構(gòu)造器創(chuàng)建實例
Object obj = constructor.newInstance("23333");
System.out.println(obj);

4. 獲取構(gòu)造器信息

主要是通過Class類的getConstructor方法得到Constructor類的一個實例,而Constructor類有一個newInstance方法可以創(chuàng)建一個對象實例

5. 獲取方法

<1> getDeclaredMethods() – 返回類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法

public Method[] getDeclaredMethods() throws SecurityException

<2> getMethods() – 返回某個類的所有公共(public)方法,包括繼承的公有方法

public Method[] getMethods() throws SecurityException

<3> getDeclaredMethod() – 返回一個特定的方法,其中第一個參數(shù)為方法名稱,后面的參數(shù)為方法的參數(shù)類型對應(yīng)的Class對象

public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

<4> getMethod() – 返回一個特定的方法,其中第一個參數(shù)為方法名稱,后面的參數(shù)為方法的參數(shù)類型對應(yīng)的Class對象

public Method getMethod(String name, Class<?>... parameterTypes)

6. 獲取類的成員變量(字段)信息

getDeclaredFields() – 訪問所有已聲明的成員變量,但不能訪問繼承的成員變量。

getFileds() – 訪問所有已聲明的公有(public)成員變量,包括繼承的公有成員變量。

getDeclaredField() – 特定訪問所有成員變量(不包括繼承的),參數(shù)為成員變量的名字。

getFiled() – 特定訪問公有成員變量(包括繼承的),參數(shù)為成員變量的名字。

7. 利用反射創(chuàng)建數(shù)組

Class<?> cls = Class.forName("java.lang.String");
Object array = Array.newInstance(cls, 25);
//往數(shù)組里添加內(nèi)容
Array.set(array, 0, "hello");
Array.set(array, 1, "Java");
Array.set(array, 2, "fuck");
Array.set(array, 3, "Scala");
Array.set(array, 4, "Clojure");
//獲取某一項的內(nèi)容
System.out.println(Array.get(array,3));
//加入Java開發(fā)交流君樣:756584822一起吹水聊天

其中的Array類為java.lang.reflect.Array類,我們通過Array.newInstance()創(chuàng)建數(shù)組對象,它的原型是:

public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException {
return newArray(componentType, length);
}

newArray()方法是一個Native方法:

private static native Object newArray(Class<?> componentType, int length) throws NegativeArraySizeException;

反射的注意事項

由于反射會額外消耗一定的系統(tǒng)資源,因此如果不需要動態(tài)地創(chuàng)建一個對象,那么就不需要用反射。反射調(diào)用方法時可以忽略權(quán)限檢查,因此可能會破壞封裝性而導(dǎo)致安全問題。

反射的主要用途

最重要的用途就是開發(fā)各種通用框架

很多框架(比如Spring)都是配置化的(比如通過XML文件配置JavaBean,Action之類的),為了保證框架的通用性,它們可能需要根據(jù)配置文件加載不同的對象或類,調(diào)用不同的方法,這個時候就必須用到反射——運行時動態(tài)加載需要加載的對象。

總結(jié)

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

相關(guān)文章

  • Spring獲取當前類在容器中的beanname實現(xiàn)思路

    Spring獲取當前類在容器中的beanname實現(xiàn)思路

    這篇文章主要介紹了Spring獲取當前類在容器中的beanname,實現(xiàn)思路只需繼承BeanNameAware接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 一文帶你學(xué)會Java中ScheduledThreadPoolExecutor使用

    一文帶你學(xué)會Java中ScheduledThreadPoolExecutor使用

    ScheduledThreadPoolExecutor是Java并發(fā)包中的一個類,同時也是?ThreadPoolExecutor的一個子類,本文主要為大家介紹一下ScheduledThreadPoolExecutor使用,需要的可以參考下
    2024-12-12
  • SpringBoot logback日志框架使用過程解析

    SpringBoot logback日志框架使用過程解析

    這篇文章主要介紹了SpringBoot logback日志框架使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Android Studio中ButterKnife插件的安裝與使用詳解

    Android Studio中ButterKnife插件的安裝與使用詳解

    本篇文章主要介紹了Android Studio中ButterKnife插件的安裝與使用詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java線程間的通信方式詳解

    Java線程間的通信方式詳解

    這篇文章主要為大家詳細介紹了Java線程間的通信方式,以代碼結(jié)合文字的方式來討論線程間的通信,感興趣的朋友可以參考一下
    2016-05-05
  • Java多線程中的死鎖詳解

    Java多線程中的死鎖詳解

    這篇文章主要介紹了Java多線程中的死鎖詳解,死鎖是指兩個或多個線程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,如果不提前預(yù)防或外界干擾,這些線程將無法執(zhí)行下去,需要的朋友可以參考下
    2023-08-08
  • Java實現(xiàn)的zip壓縮及解壓縮工具類示例

    Java實現(xiàn)的zip壓縮及解壓縮工具類示例

    這篇文章主要介紹了Java實現(xiàn)的zip壓縮及解壓縮工具類,結(jié)合實例形式分析了java對文件的進行zip壓縮及解壓縮的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • @FeignClient之name,value,url詳解

    @FeignClient之name,value,url詳解

    在FeignClient中,`name`用于指定服務(wù)的名稱,通常與服務(wù)注冊中心中的服務(wù)名關(guān)聯(lián),而`url`用于指定請求的基礎(chǔ)URL,適用于不使用服務(wù)注冊的場景,如果同時配置了`name`和`url`,則`url`會優(yōu)先生效,Feign會直接使用`url`指定的地址
    2024-11-11
  • springboot+vue制作后臺管理系統(tǒng)項目

    springboot+vue制作后臺管理系統(tǒng)項目

    本文詳細介紹了后臺管理使用springboot+vue制作,以分步驟、圖文的形式詳細講解,大家有需要的可以參考參考
    2021-08-08
  • 一文詳細講解Java的父子繼承、方法的重寫與super關(guān)鍵字

    一文詳細講解Java的父子繼承、方法的重寫與super關(guān)鍵字

    Java中繼承是通過extends關(guān)鍵字實現(xiàn),幫助減少代碼重復(fù),提高復(fù)用性,子類繼承父類的屬性和方法,但私有成員除外,方法重寫(override)使子類改造父類方法以適應(yīng)新功能,這篇文章主要介紹了Java的父子繼承、方法的重寫與super關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下
    2024-10-10

最新評論

报价| 蛟河市| 织金县| 时尚| 南华县| 城口县| 盈江县| 湘乡市| 策勒县| 广元市| 星座| 读书| 炉霍县| 合水县| 昌宁县| 浙江省| 襄樊市| 长治县| 旬邑县| 吴堡县| 民丰县| 靖宇县| 当雄县| 安义县| 安康市| 武乡县| 淮南市| 兴安县| 苍南县| 景洪市| 班玛县| 依安县| 乐昌市| 资中县| 楚雄市| 盈江县| 镇沅| 晋中市| 仙居县| 合作市| 隆德县|