阿里高頻面試題:你可以講下什麼是反射嗎?

2019年以來,互聯網行業持續性的寒冬不斷加劇,再加上整個行業對於程序員的需求趨於飽和,相應的對於程序員的能力要求也是越來越高,傳統的

CURD工程師逐漸退出市場,對於廣大程序員群體來說,如果想要跟上歷史潮流不被時代拋棄,就要不斷地提高自身的技術能力,以便在互聯網寒冬的今天能夠有一席之地。

阿里高頻面試題:你可以講下什麼是反射嗎?

當我們面對一項新的知識時,我們往往需要知道三個方面,它是什麼?為什麼要使用它?我們該怎麼使用它?


是什麼

  “Java Reflaction in Action”有這麼一句話,可以解釋。反射是運行中的程序檢查自己和軟件運行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在運行時根據指定的類名獲得類的信息。

為什麼

我們為什麼要使用反射,它的作用是什麼,它在實際的編程中有什麼應用。首先我們先明確兩個概念,靜態編譯和動態編譯。

  靜態編譯:編譯時確定類型,綁定對象。

  動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了Java的靈活性,體現了多態的應用,降低類之間的耦合。

我們可以明確的看出動態編譯的好處,而反射就是運用了動態編譯創建對象。

那麼我們再來看看實際中反射又有什麼好處那?往往對比能更加直觀的向我們展示兩者的不同。若是不用反射,它是這樣的


阿里高頻面試題:你可以講下什麼是反射嗎?


構造工廠類,也就是說以後如果我們在添加其他的實例的時候只需要修改工廠類就行了


阿里高頻面試題:你可以講下什麼是反射嗎?

可以發現,每當我們要添加一種新的水果的時候,我們將不得不改變Factory中的源碼,而往往改變原有正確代碼是一種十分危險的行為。而且隨著水果種類的增加,你會發現你的factory類會越來越臃腫,不得不說這是一種十分lowB的做法。(初學者可能會問,我們為什麼不直接在main方法中new水果那,我們可能會需要getInstance方法做一些別的事情。。。所以不直接new),而反射無疑是一種聰明的辦法,用反射實現上述工廠類


阿里高頻面試題:你可以講下什麼是反射嗎?

在出現新品種水果的時候,你完全不用去修改原有代碼。從上面的案例中,我們可以清楚的體會到反射的優越性。

那麼有的人又會問,這個例子能完全明白,但是如果放到實際的編程,應用中,我們又會在什麼情況下用到反射那?

舉一個看到過的例子,在實際開發中,我們需要把一個包中的class new出來,但是這個包中的類總是需要變動,那麼怎麼辦,難道總是修改main方法中xxx=new xxx()嗎。這樣無疑是麻煩的。而運用反射。我們可以相應的增加一個配置文件,在裡面記錄包中所有的類名,包中類增加時就加一個類名,刪除時就刪除一個類名。讓main方法去讀取這個配置文件中的類名,通過反射獲得實例,完全不用我們去修改main方法中的代碼。

反射還有什麼用呢?它甚至可以修改一個類(實例)中的私有屬性。Java開發中,我們需要改變一個私有標誌位的時候,Java源碼並沒有提供set方法,我們又不能改變源碼,怎麼辦,反射可以完美解決這個問題。

說了這麼多,那麼我們的開發中,為什麼不全部都用反射那?一個原因,開銷,它的開銷是十分昂貴的,隨意儘量在最需要的地方使用反射。

怎麼用

  說完是什麼,為什麼,我們必然需要掌握如何使用反射,先看反射中涉及了那些方法。

  • 獲取類;className必須為類的全限定名

  Class c=Class.forName("className");

  • 創建類的實例

Object obj=c.newInstance();

  • 獲得構造函數的方法

Constructor getConstructor(Class[] params);

Constructor[] getConstructors();

Constructor getDeclaredConstructor(Class[] params);

Constructor[] getDeclaredConstructors();

  • 獲得類方法的方法

Method getMethod(String name, Class[] params);

Method[] getMethods();

Method getDeclaredMethod(String name, Class[] params);

Method[] getDeclaredMethods();

  • 獲得類中屬性的方法

Field getField(String name);

Field[] getFields();

Field getDeclaredField(String name);

Field[] getDeclaredFields();

  看到這些方法,你就可以明白,反射是多麼的強大了,當你正確使用這些方法的時候,基本上是掌握了反射的技巧,更不用說和麵試官對答如流了。


關注評論後可

私信獲取更多最新大廠面試資料,如果你需要一線互聯網公司的內推機會(社招+校招),也可以私聊我哦


分享到:


相關文章: