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 和 rvlet 有什么区别?
JSP 是 rvlet 技术的扩展,本质上就是 rvlet 的简易⽅式。rvlet 和 JSP 最
主要的不同点在于,rvlet 的应⽤逻辑是在 Java ⽂件中,并且完全从表⽰层中
的 html ⾥分离开来,⽽ JSP 的情况是 Java 和 html 可以组合成⼀个扩展名为
JSP 的⽂件。JSP 侧重于视图,rvlet 主要⽤于控制逻辑。
9.JSP 有哪些内置对象?作⽤分别是什么?
JSP 有 9 ⼤内置对象:
request:封装客户端的请求,其中包含来⾃ get 或 post 请求的参数;
respon:封装服务器对客户端的响应;
美白防晒霜
pageContext:通过该对象可以获取其他对象;
ssion:封装⽤户会话的对象;
application:封装服务器运⾏环境的对象;
out:输出服务器响应的输出流对象;
config:Web 应⽤的配置对象;
page:JSP 页⾯本⾝(相当于 Java 程序中的 this);
exception:封装页⾯抛出异常的对象。
10. 说⼀下 JSP 的 4 种作⽤域?
page:代表与⼀个页⾯相关的对象和属性。
request:代表与客户端发出的⼀个请求相关的对象和属性。⼀个请求可能跨越多
个页⾯,涉及多个 Web 组件;需要在页⾯显⽰的临时数据可以置于此作⽤域。
ssion:代表与某个⽤户与服务器建⽴的⼀次会话相关的对象和属性。跟某个⽤
户相关的数据应该放在⽤户⾃⼰的 ssion 中。
application:代表与整个 Web 应⽤程序相关的对象和属性,它实质上是跨越整
个 Web 应⽤程序,包括多个页⾯、请求和会话的⼀个全局作⽤域。
11. ssion 和 cookie 有什么区别?
存储位置不同:ssion 存储在服务器端;cookie 存储在浏览器端。
安全性不同:cookie 安全性⼀般,在浏览器存储,可以被伪造和修改。
容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。存储的多样性:ssion 可以存储在 Redis 中、数据库中、应⽤程序中;⽽ cookie
只能存储在浏览器中。
12. 说⼀下 ssion 的⼯作原理?
ssion 的⼯作原理是客户端登录完成之后,服务器会创建对应的 ssion,
ssion 创建完之后,会把 ssion 的 id 发送给客户端,客户端再存储到浏览
器中。这样客户端每次访问服务器时,都会带着 ssionid,服务器拿到 ssionid
之后,在内存找到与之对应的 ssion 这样就可以正常⼯作了。
13.如果客户端禁⽌ cookie 能实现 ssion 还能⽤吗?
可以⽤,ssion 只是依赖 cookie 存储 ssionid,如果 cookie 被禁⽤了,可以
使⽤ url 中添加 ssionid 的⽅式保证 ssion 能正常使⽤。
14.spring mvc 和 struts 的区别是什么?
拦截级别:struts2 是类级别的拦截;spring mvc 是⽅法级别的拦截。
数据独⽴性:spring mvc 的⽅法之间基本上独⽴的,独享 request 和 respon
数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,⽅法之
间不共享变量;⽽ struts2 虽然⽅法之间也是独⽴的,但其所有 action 变量是
共享的,这不会影响程序运⾏,却给我们编码和读程序时带来了⼀定的⿇烦。
拦截机制:struts2 有以⾃⼰的 interceptor 机制,spring mvc ⽤的是独⽴的 aop
⽅式,这样导致 struts2 的配置⽂件量⽐ spring mvc ⼤。
对 ajax 的⽀持:spring mvc 集成了 ajax,所有 ajax 使⽤很⽅便,只需要⼀个注
解 @ResponBody 就可以实现了;⽽ 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。
<-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 函数”来执⾏的。