Java相關面試題總結+答案(四)


【反射】


57. 什么是反射?

   反射是在運行狀態中,對於任意一個類,都能夠知道該類的所有屬性和方法,對於任意一個對象,都能夠獲得該對象的任一屬性和方法;這種動態獲取信息以及動態調用對象的方法的功能稱之為Java語言的反射機制。

58. 什么是 Java 序列化?什么情況下需要序列化?

  Java序列化是為了保存各種對象在內存中的狀態,並且可以把保存的對象狀態再讀出來。

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

  • 想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
  • 想用套接字在網絡上傳送對象的時候;
  • 想通過RMI(遠程方法調用)傳輸對象的時候。

59. 動態代理是什么?有哪些應用?

  動態代理是運行時動態生成代理類。

  動態代理的應用有 spring aop、hibernate 數據查詢、測試框架的后端 mock、rpc,Java注解對象獲取等。

60. 怎么實現動態代理?

  JDK原生動態代理和cglib動態代理。JDK原生動態代理是基於接口實現的,而cglib是基於繼承當前類的子類實現的。

【對象拷貝】


61. 為什么要使用克隆?

  克隆的對象可能包含一些已經修改過的屬性,而new出來的對象屬性都還是初始化時候的值,所以當需要一個新的對象來保存當前對象的“狀態”就需要使用克隆方法了。

62. 如何實現對象克隆?

  • 實現 Cloneable 接口並重寫Object類中的clone() 方法。
  • 實現 Serializable 接口,通過對象的序列化和反序列化來實現克隆,可以實現真正的深度克隆。

63. 深拷貝和淺拷貝區別是什么?

  • 淺克隆:當對象被復制時只復制它本身和其中包含的值類型的成員變量,而引用類型的成員對象並沒有被復制。
  • 深克隆:除了對象本身被復制外,對象所包含的所有成員變量也將被復制。

【Java Web】


64. JSP 和 servlet 有什么區別?

  JSP是 servlet 技術的擴展,本質上就是 servlet 的簡易方式。servlet 和 JSP 最主要的不同點在於,servlet 的邏輯是在Java文件中,並且完全從表示層中的 html 中完全分離出來了,而JSP 的情況是Java 和 html 可以組成一個擴展名為 jsp 的文件。 JSP 側重於視圖,servlet 主要用於控制邏輯。

65. JSP 有哪些內置對象?作用分別是什么?

JSP 有 9 大內置對象:

  • request:封裝客戶端的請求,其中包括來自 get 和 post 請求的參數;
  • response:封裝服務器對客戶端的響應;
  • pageContext:通過該對象可以獲取其他對象;
  • session:封裝用戶會話的對象;
  • application:封裝服務器運行環境的對象 ;
  • out:輸出服務器響應的輸出流對象;
  • config:web 應用的配置對象;
  • page:JSP 頁面本身(相當於 Java 中的 this);
  • exception:封裝頁面拋出異常的對象。

66. 說一下 JSP 的 4 種作用域?

  • page:代表與一個頁面相關的屬性和對象。
  • request:代表與客戶端發出的一個請求相關的屬性和對象。一個請求可能跨越多個頁面,涉及多個 web 組件;需要在頁面顯示的臨時數據可置於此作用域。
  • session:代表與某個用戶和服務器建立的一次會話相關的屬性和對象。跟某個用戶相關的數據應該放在該用戶自己的 session 中。
  • application:代表整個 web 應用程序相關的屬性和對象,它實際上是跨越整個 web 應用程序,包括多個頁面、請求和會話的一個全局作用域。

67. session 和 cookie 有什么區別?

  • 存儲位置不同:session 存儲在服務器端,cookie 存儲在瀏覽器端。
  • 安全性不同:cookie 安全性一般,在瀏覽器存儲,可以被偽造和修改。
  • 容量和個數限制不同:cookie 有容量限制,每個站點下的 cookie 也有個數限制。
  • 存儲的多樣性:session 可以存儲在 Redis中、數據庫中、應用程序中;而 cookie 只能存儲在瀏覽器中。

68. 說一下 session 的工作原理?

  session 的工作原理是客戶端登錄完成之后,服務器會創建對用的 session,session 創建完之后,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器都會帶着sessionid ,服務器拿到 sessionid 之后,在內存中找到與之對應的 session 這樣就可以正常工作了。

69. 如果客戶端禁止 cookie 的實現 ,session 還能用嗎?

  可以用,session 只是依賴 cookie 存儲 sessionid,如果 cookie 被禁用了,可以使用在 url 中添加 sessionid 的方式保證 session 可以正常使用。

70. 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 一般需要安裝插件或者自己寫代碼才行。

71. 如何避免 SQL 注入?

  • 使用預處理 PreparedStatement。
  • 使用正則表達式過濾掉字符中的特殊字符。

72. 什么是 XSS 攻擊,如何避免?

  xss 攻擊:即跨站腳本攻擊,它是 web 程序中常見的漏洞。原理是攻擊者往 web 里插入惡意的腳本代碼(css 代碼、JavaScript 代碼等),當用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜取用戶 cookie、破壞頁面結構、重定向到其他網站等。

  預防 xss 的核心是必須對輸入的數據做過濾處理。

73. 什么是 CSRF 攻擊,如何避免?

  CSRF:Cross-Site Request Forgery(中文:跨站請求偽造),可以理解為攻擊者盜用了你的身份,以你的名義發送惡意的請求,比如以你的名義發送郵件、發消息、購買商品、虛擬貨幣轉賬等。

  防御手段:

    • 驗證請求來源地址;
    • 關鍵操作添加驗證碼;
    • 在請求地址添加 token 並驗證。


免責聲明!

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



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