java反射面試題(2020)


反射
1 什么是反射?
反射是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息
以及動態調用對象的方法的功能稱為 Java 語言的反射機制。
2.什么是 Java 序列化?什么情況下需要序列化?
Java 序列化是為了保存各種對象在內存中的狀態,並且可以把保存的對象狀態
再讀出來。
以下情況需要使用 Java 序列化:
想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
想用套接字在網絡上傳送對象的時候;
想通過 RMI(遠程方法調用)傳輸對象的時候。
3. 動態代理是什么?有哪些應用?
動態代理是運行時動態生成代理類。
動態代理的應用有 spring aop、hibernate 數據查詢、測試框架的后端 mock、
rpc,
Java 注解對象獲取等。
4.怎么實現動態代理?
JDK 原生動態代理和 cglib 動態代理。JDK 原生動態代理是基於接口實現的,而
cglib 是基於繼承當前類的子類實現的。
5. 為什么要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而 new 出來的對象的屬性都還是
初始化時候的值,所以當需要一個新的對象來保存當前對象的“狀態”就靠克隆
方法了。
對象拷貝
6.如何實現對象克隆?
實現 Cloneable 接口並重寫 Object 類中的 clone() 方法。
實現 Serializable 接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆。
7.深拷貝和淺拷貝區別是什么?
淺克隆:當對象被復制時只復制它本身和其中包含的值類型的成員變量,而引用
類型的成員對象並沒有復制。
深克隆:除了對象本身被復制外,對象所包含的所有成員變量也將復制。
Java Web
8.JSP 和 servlet 有什么區別?
JSP 是 servlet 技術的擴展,本質上就是 servlet 的簡易方式。servlet 和 JSP 最
主要的不同點在於,servlet 的應用邏輯是在 Java 文件中,並且完全從表示層中
的 html 里分離開來,而 JSP 的情況是 Java 和 html 可以組合成一個擴展名為
JSP 的文件。JSP 側重於視圖,servlet 主要用於控制邏輯。
9.JSP 有哪些內置對象?作用分別是什么?
JSP 有 9 大內置對象:
request:封裝客戶端的請求,其中包含來自 get 或 post 請求的參數;
response:封裝服務器對客戶端的響應;
pageContext:通過該對象可以獲取其他對象;
session:封裝用戶會話的對象;
application:封裝服務器運行環境的對象;
out:輸出服務器響應的輸出流對象;
config:Web 應用的配置對象;
page:JSP 頁面本身(相當於 Java 程序中的 this);
exception:封裝頁面拋出異常的對象。
10. 說一下 JSP 的 4 種作用域?
page:代表與一個頁面相關的對象和屬性。
request:代表與客戶端發出的一個請求相關的對象和屬性。一個請求可能跨越多
個頁面,涉及多個 Web 組件;需要在頁面顯示的臨時數據可以置於此作用域。
session:代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用
戶相關的數據應該放在用戶自己的 session 中。
application:代表與整個 Web 應用程序相關的對象和屬性,它實質上是跨越整
個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域。
11. session 和 cookie 有什么區別?
存儲位置不同:session 存儲在服務器端;cookie 存儲在瀏覽器端。
安全性不同:cookie 安全性一般,在瀏覽器存儲,可以被偽造和修改。
容量和個數限制:cookie 有容量限制,每個站點下的 cookie 也有個數限制。存儲的多樣性:session 可以存儲在 Redis 中、數據庫中、應用程序中;而 cookie
只能存儲在瀏覽器中。
12. 說一下 session 的工作原理?
session 的工作原理是客戶端登錄完成之后,服務器會創建對應的 session,
session 創建完之后,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽
器中。這樣客戶端每次訪問服務器時,都會帶着 sessionid,服務器拿到 sessionid
之后,在內存找到與之對應的 session 這樣就可以正常工作了。
13.如果客戶端禁止 cookie 能實現 session 還能用嗎?
可以用,session 只是依賴 cookie 存儲 sessionid,如果 cookie 被禁用了,可以
使用 url 中添加 sessionid 的方式保證 session 能正常使用。
14.spring mvc 和 struts 的區別是什么?
攔截級別:struts2 是類級別的攔截;spring mvc 是方法級別的攔截。
數據獨立性:spring mvc 的方法之間基本上獨立的,獨享 request 和 response
數據,請求數據通過參數獲取,處理結果通過 ModelMap 交回給框架,方法之
間不共享變量;而 struts2 雖然方法之間也是獨立的,但其所有 action 變量是
共享的,這不會影響程序運行,卻給我們編碼和讀程序時帶來了一定的麻煩。
攔截機制:struts2 有以自己的 interceptor 機制,spring mvc 用的是獨立的 aop
方式,這樣導致 struts2 的配置文件量比 spring mvc 大。
對 ajax 的支持:spring mvc 集成了 ajax,所有 ajax 使用很方便,只需要一個注
解 @ResponseBody 就可以實現了;而 struts2 一般需要安裝插件或者自己寫代
碼才行。
15.如何避免 SQL 注入?
使用預處理 PreparedStatement。
使用正則表達式過濾掉字符中的特殊字符。
16 什么是 XSS 攻擊,如何避免?
XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見的漏洞。原理是攻擊者往
Web 頁面里插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當用戶瀏覽
該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜
取用戶 cookie、破壞頁面結構、重定向到其他網站等。
預防 XSS 的核心是必須對輸入的數據做過濾處理。
17.什么是 CSRF 攻擊,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站請求偽造),可以理解為攻擊者盜用了你的身份,以你的名義發送惡意請求,比如:以你名義發送郵件、發消息、
購買商品,虛擬貨幣轉賬等。
防御手段:
驗證請求來源地址;
關鍵操作添加驗證碼;
在請求地址添加 token 並驗證。
異常
18. throw 和 throws 的區別?
throw:是真實拋出一個異常。
throws:是聲明可能會拋出一個異常。
19. final、finally、finalize 有什么區別?
final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表示
此方法和此變量不能在被改變,只能使用。
finally:是 try{} catch{} finally{} 最后一部分,表示不論發生任何情況都會執行,
finally 部分可以省略,但如果 finally 部分存在,則一定會執行 finally 里面的代
碼。
finalize: 是 Object 類的一個方法,在垃圾收集器執行的時候會調用被回收對象
的此方法。
20. try-catch-finally 中哪個部分可以省略?
try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同時省略,也就
是說有 try 的時候,必須后面跟一個 catch 或者 finally。
21.try-catch-finally 中,如果 catch 中 return 了,finally 還會執
行嗎?
finally 一定會執行,即使是 catch 中 return 了,catch 中的 return 會等 finally
中的代碼執行完之后,才會執行。
22.常見的異常類有哪些?
NullPointerException 空指針異常
ClassNotFoundException 指定類不存在
NumberFormatException 字符串轉換為數字異常
IndexOutOfBoundsException 數組下標越界異常
ClassCastException 數據類型轉換異常
FileNotFoundException 文件未找到異常
NoSuchMethodException 方法不存在異常IOException IO 異常
SocketException Socket 異常
網絡
23.http 響應碼 301 和 302 代表的是什么?有什么區別?
301:永久重定向。
302:暫時重定向。
它們的區別是,301 對搜索引擎優化(SEO)更加有利;302 有被提示為網絡攔
截的風險。
24.forward 和 redirect 的區別?
forward 是轉發 和 redirect 是重定向:
地址欄 url 顯示:foward url 不會發生改變,redirect url 會發生改變;
數據共享:forward 可以共享 request 里的數據,redirect 不能共享;
效率:forward 比 redirect 效率高。
25. 簡述 tcp 和 udp 的區別?
tcp 和 udp 是 OSI 模型中的運輸層中的協議。
tcp 提供可靠的通信傳輸,而 udp
則常被用於讓廣播和細節控制交給應用的通信傳輸。
兩者的區別大致如下:
tcp 面向連接,udp 面向非連接即發送數據前不需要建立鏈接;
tcp 提供可靠的服務(數據傳輸),udp 無法保證;
tcp 面向字節流,udp 面向報文;
tcp 數據傳輸慢,udp 數據傳輸快;
26. tcp 為什么要三次握手,兩次不行嗎?為什么?
如果采用兩次握手,那么只要服務器發出確認數據包就會建立連接,但由於客戶
端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣
服務器端就白白浪費了一定的資源。若采用三次握手,服務器端沒有收到來自客
戶端的再此確認,則就會知道客戶端並沒有要求建立請求,就不會浪費服務器的
資源。
27.說一下 tcp 粘包是怎么產生的?
tcp 粘包可能發生在發送端或者接收端,分別來看兩端各種產生粘包的原因:
發送端粘包:發送端需要等緩沖區滿才發送出去,造成粘包;
接收方粘包:接收方不及時接收緩沖區的包,造成多個包接收。28. OSI 的七層模型都有哪些?
物理層:利用傳輸介質為數據鏈路層提供物理連接,實現比特流的透明傳輸。
數據鏈路層:負責建立和管理節點間的鏈路。
網絡層:通過路由選擇算法,為報文或分組通過通信子網選擇最適當的路徑。
傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
會話層:向兩個實體的表示層提供建立和使用連接的方法。
表示層:處理用戶信息的表示問題,如編碼、數據格式轉換和加密解密等。
應用層:直接向用戶提供服務,完成用戶希望在網絡上完成的各種工作。
29. get 和 post 請求有哪些區別?
get 請求會被瀏覽器主動緩存,而 post 不會。
get 傳遞參數有大小限制,而 post 沒有。
post 參數傳輸更安全,get 的參數會明文限制在 url 上,post 不會。
30. 如何實現跨域?
實現跨域有以下幾種方案:
服務器端運行跨域 設置 CORS 等於 *;
在單個接口使用注解 @CrossOrigin 運行跨域;
使用 jsonp 跨域;
31. 說一下 JSONP 實現原理?
jsonp:JSON with Padding,它是利用 script 標簽的 src 連接可以訪問不同源的特
性,加載遠程返回的“JS 函數”來執行的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM