Java反射常見經(jīng)典面試題

Java反射常見經(jīng)典面試題

北大青鳥長沙麓谷校區(qū)      2022-04-08 02:28:01     1

Java反射常見經(jīng)典面試題,  1.什么是反射?  反射是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹


  1.什么是反射?


  反射是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為Java語言的反射機(jī)制。


  2.哪里用到反射機(jī)制?


  JDBC中,利用反射動(dòng)態(tài)加載了數(shù)據(jù)庫驅(qū)動(dòng)程序。


  Web服務(wù)器中利用反射調(diào)用了Sevlet的服務(wù)方法。


  Eclispe等開發(fā)工具利用反射動(dòng)態(tài)刨析對(duì)象的類型與結(jié)構(gòu),動(dòng)態(tài)提示對(duì)象的屬性和方法。


  很多框架都用到反射機(jī)制,注入屬性,調(diào)用方法,如Spring。


  3.什么叫對(duì)象序列化,什么是反序列化,實(shí)現(xiàn)對(duì)象序列化需要做哪些工作?


  對(duì)象序列化,將對(duì)象中的數(shù)據(jù)編碼為字節(jié)序列的過程。


  反序列化;將對(duì)象的編碼字節(jié)重新反向解碼為對(duì)象的過程。


  JAVA提供了API實(shí)現(xiàn)了對(duì)象的序列化和反序列化的功能,使用這些API時(shí)需要遵守如下約定:


  被序列化的對(duì)象類型需要實(shí)現(xiàn)序列化接口,此接口是標(biāo)志接口,沒有聲明任何的抽象方法,JAVA編譯器識(shí)別這個(gè)接口,自動(dòng)的為這個(gè)類添加序列化和反序列化方法。


  為了保持序列化過程的穩(wěn)定,建議在類中添加序列化版本號(hào)。


  不想讓字段放在硬盤上就加transient


  以下情況需要使用Java序列化:


  想把的內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫中時(shí)候;


  想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候;


  想通過RMI(遠(yuǎn)程方法調(diào)用)傳輸對(duì)象的時(shí)候。


  4.反射機(jī)制的優(yōu)缺點(diǎn)?


  優(yōu)點(diǎn):可以動(dòng)態(tài)執(zhí)行,在運(yùn)行期間根據(jù)業(yè)務(wù)功能動(dòng)態(tài)執(zhí)行方法、訪問屬性,最大限度發(fā)揮了java的靈活性。


  缺點(diǎn):對(duì)性能有影響,這類操作總是慢于直接執(zhí)行java代碼。


  5.動(dòng)態(tài)代理是什么?有哪些應(yīng)用?


  動(dòng)態(tài)代理是運(yùn)行時(shí)動(dòng)態(tài)生成代理類。


  動(dòng)態(tài)代理的應(yīng)用有SpringAOP數(shù)據(jù)查詢、測試框架的后端mock、rpc,Java注解對(duì)象獲取等。


  6.怎么實(shí)現(xiàn)動(dòng)態(tài)代理?


  JDK原生動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理。


  JDK原生動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的,而cglib是基于繼承當(dāng)前類的子類實(shí)現(xiàn)的。


  7.Java反射機(jī)制的作用


  在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類


  在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象


  在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法


  在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法


  8.如何使用Java的反射?


  通過一個(gè)全限類名創(chuàng)建一個(gè)對(duì)象


  Class.forName(“全限類名”);例如:com.mysql.jdbc.DriverDriver類已經(jīng)被加載到j(luò)vm中,并且完成了類的初始化工作就行了


  類名.class;獲取Class<?>clz對(duì)象


  對(duì)象.getClass();


  獲取構(gòu)造器對(duì)象,通過構(gòu)造器new出一個(gè)對(duì)象


  Clazz.getConstructor([String.class]);


  Con.newInstance([參數(shù)]);


  通過class對(duì)象創(chuàng)建一個(gè)實(shí)例對(duì)象(就相當(dāng)與new類名()無參構(gòu)造器)


  Cls.newInstance();


  通過class對(duì)象獲得一個(gè)屬性對(duì)象


  Fieldc=cls.getFields():獲得某個(gè)類的所有的公共(public)的字段,包括父類中的字段。


  Fieldc=cls.getDeclaredFields():獲得某個(gè)類的所有聲明的字段,即包括public、private和proteced,但是不包括父類的聲明字段


  通過class對(duì)象獲得一個(gè)方法對(duì)象


  Cls.getMethod(“方法名”,class……parameaType);(只能獲取公共的)


  Cls.getDeclareMethod(“方法名”);(獲取任意修飾的方法,不能執(zhí)行私有)


  M.setAccessible(true);(讓私有的方法可以執(zhí)行)


  讓方法執(zhí)行


  1).Method.invoke(obj實(shí)例對(duì)象,obj可變參數(shù));-----(是有返回值的)


  


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。