Java基础知识收集(四)

目录

1、Java中static关键字的四种用法

2、Java中static关键字的四种用法

4、Java中foreach实现原理

5、线程池实现原理,可以(参考死扣Java并发)

6、线程池的种类,区别和使用场景(参考死扣Java并发)

7、union和union all

8、inner join、left join、right join、full outer join、union、union all的区别

9、Mysql几种索引类型的区别及适用情况

10、Java对象的生命周期

11、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

12、数据库存储日期格式时,如何考虑时区转换问题?

13、浅谈GET和POST 的区别

14、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

15、如何看待设计模式,并简单说说你对观察者模式的理解

16、集群/分布式环境下5种共享session处理策略

17、分布式、集群环境中,缓存如何刷新,如何保持同步?

18、一条sql执行过长的时间,你如何优化,从哪些方面?

19、hibernate跟Mybatis/ ibatis 的区别,为什么选择?

20、Struts跟Spring mvc的优缺点,让你选会如何选

21、多线程和单线程的区别和联系

22、多线程产生死锁的 4 个必要条件

23、ThreadLocal 内部实现机制

24、垃圾回收算法有哪些

25、GC发生在什么时候?

26、Java8新特性

27、三次握手、四次挥手

28、浏览器中输入:“www.xxx.com” 之后都发生了什么?请详细阐述。

29、常见 HTTP 状态码

30、TCP 和 UDP 的区别

31、数据库的索引有什么作用?(必考) 底层数据结构是什么,为什么使用这种数据结构?

32、事务的四大特性

33、事务的并发问题有哪几种?

34、数据库中的锁有哪几种?

35、数据库事务的隔离级别有哪几种?

36、Spring AOP 的实现方式有哪几种?如何选择?

37、Spring MVC流程

38、Spring MVC原理分析

39、shell命令

40、Dubbo底层采用Socket进行通信详解

41、redis的部署方式:主从、集群。

42、redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里

43、SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。

44、SpringMVC 页面传递参数到controller的五种方式

45、Quartz是如何完成定时任务的

46、自定义注解的实现

47、Java的反射的用途及实现

48、Java注解的用途、Java注解的用途

49、JDBC的流程

50、分布式数据库主键方案 详解


1、Java中static关键字的四种用法

https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral

  1. 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
  2. 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
  3. 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
  4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

2、Java中static关键字的四种用法

https://www.cnblogs.com/dotgua/p/6357951.html

  1. 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
  2. 用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
  3. 修饰方法,表示该方法无法被重写;
  4. 修饰类,表示该类无法被继承。

3、Java中transient的使用

transient阻止实例中那些用此关键字声明的变量持久化

http://www.importnew.com/12611.html

4、Java中foreach实现原理

新形式的遍历虽然好用,但是他丢掉了索引信息。当你需要访问数组或者集合的下标,你将不能使用foreach。
从JDK的第五个版本开始加入了这个foreach功能,但是java语言对于它的实现做了隐藏,他是隐藏在语言内部的
  foreach循环的几个特性
       1.foreach遍历不能对元素进行赋值操作
       2.同时只能遍历一个
       3.遍历的时候,只有当前被遍历的元素可见,其他不可见
       4.只能正向遍历,不能反向
       5.foreach对ArrayList的遍历是因为其实现了Iterable接口

5、线程池实现原理,可以(参考死扣Java并发)

http://www.cnblogs.com/dolphin0520/p/3932921.html

6、线程池的种类,区别和使用场景(参考死扣Java并发)

https://www.cnblogs.com/sachen/p/7401959.html

7、union和union all

union会去掉重复记录,union all会保留重复记录

http://www.w3school.com.cn/sql/sql_union.asp

8、inner join、left join、right join、full outer join、union、union all的区别

https://www.cnblogs.com/logon/p/3748020.html

9、Mysql几种索引类型的区别及适用情况

https://www.cnblogs.com/yuan-shuai/p/3225417.html

10、Java对象的生命周期

创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期

11、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)

看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果

12、数据库存储日期格式时,如何考虑时区转换问题?

使用TimeStamp。MySQL中Date,DateTime,TimeStamp和Time的解释和区别

13、浅谈GET和POST 的区别

浅谈HTTP中GET和POST的区别

14、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

关于SimpleDateFormat安全的时间格式化线程安全问题

15、如何看待设计模式,并简单说说你对观察者模式的理解

答:1、设计模式有神马用     2、观察者模式类图及实现

16、集群/分布式环境下5种共享session处理策略

第一种:粘性session
第二种:服务器session复制
第三种:session共享机制
第四种:session持久化到数据库
第五种:terracotta实现session复制

集群/分布式环境下5种共享session处理策略

友情链接:https://www.cnblogs.com/lyjin/p/6293570.html

17、分布式、集群环境中,缓存如何刷新,如何保持同步?

A、缓存如何刷新? 1、定时刷新  2、主动刷新覆盖   ,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可。

B、缓存如何保持同步?  这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现      ,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步

redis分布式缓存:https://www.cnblogs.com/yangxiaolan/p/5786123.html

Redis怎么保持缓存与数据库一致性:https://blog.csdn.net/belalds/article/details/82078009

18、一条sql执行过长的时间,你如何优化,从哪些方面?

1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑

19、hibernate跟Mybatis/ ibatis 的区别,为什么选择?

Hibernate与Mybatis的比较

20、Struts跟Spring mvc的优缺点,让你选会如何选

Spring MVC 与 Struts的区别

21、多线程和单线程的区别和联系

 1)在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。

 2)多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。

结论:即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。

22、多线程产生死锁的 4 个必要条件

  1. 互斥条件:一个资源每次只能被一个线程使用;
  2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放;
  3. 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺;
  4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

如何避免死锁?

  1. 比如某个线程只有获得 A 锁和 B 锁才能对某资源进行操作,在多线程条件下,如何避免死锁?
  2. 获得锁的顺序是一定的,比如规定,只有获得 A 锁的线程才有资格获取 B 锁,按顺序获取锁就可以避免死锁!!!

23、ThreadLocal 内部实现机制

  1. 每个线程内部都会维护一个类似 HashMap 的对象,称为 ThreadLocalMap,里边会包含若干了 Entry(K-V 键值对),相应的线程被称为这些 Entry 的属主线程;
  2. Entry 的 Key 是一个 ThreadLocal 实例,Value 是一个线程特有对象。Entry 的作用即是:为其属主线程建立起一个 ThreadLocal 实例与一个线程特有对象之间的对应关系;
  3. Entry 对 Key 的引用是弱引用;Entry 对 Value 的引用是强引用。

            

24、垃圾回收算法有哪些

 1)引用计数 :原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为 0 的对象。
缺点:此算法最致命的是无法处理循环引用的问题;
2)标记-清除 :
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除;
缺点:此算法需要暂停整个应用,同时,会产生内存碎片;
3)复制算法 :
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中;
缺点:此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现 “碎片” 问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间;
4)标记-整理 :
此算法结合了 “标记-清除” 和 “复制” 两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩” 到堆的其中一块,按顺序排放。
优点:此算法避免了 “标记-清除” 的碎片问题,同时也避免了 “复制” 算法的空间问题。

25、GC发生在什么时候?

GC 经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个 Eden 区和两个 Survivor 区。

  1. 对象优先在 Eden 中分配,当 Eden 中没有足够空间时,虚拟机将发生一次 Minor GC,因为 Java 大多数对象都是朝生夕灭,所以 Minor GC 非常频繁,而且速度也很快;
  2. Full GC,发生在老年代的 GC,当老年代没有足够的空间时即发生 Full GC,发生 Full GC 一般都会有一次 Minor GC。

大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个;XX:PretenureSizeThreadhold 参数,令大于这个参数值的对象直接在老年代中分配,避免在 Eden 区和两个 Survivor 区发生大量的内存拷贝;

  1. 发生 Minor GC 时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次 Full GC,如果小于,则查看 HandlePromotionFailure 设置是否允许担保失败,如果允许,那只会进行一次 Minor GC,如果不允许,则改为进行一次 Full GC。

26、Java8新特性

1)HashMap 的底层实现有变化:HashMap 是数组 + 链表 + 红黑树(JDK1.8 增加了红黑树部分)实现。
2)JVM 内存管理方面,由元空间代替了永久代。
区别:
元空间并不在虚拟机中,而是使用本地内存;
默认情况下,元空间的大小仅受本地内存限制;
也可以通过-XX:MetaspaceSize 指定元空间大小。
3)Lambda 表达式(也称为闭包),允许我们将函数当成参数传递给某个方法,或者把代码本身当做数据处理。
4)函数式接口:指的是只有一个函数的接口,java.lang.Runnable 和 java.util.concurrent.Callable 就是函数式接口的例子;java8 提供了一个特殊的注解 @Functionallnterface 来标明该接口是一个函数式接口。
5)引入重复注解:Java 8 中使用 @Repeatable 注解定义重复注解。
6)接口中可以实现方法 default 方法。
7) 注解的使用场景拓宽: 注解几乎可以使用在任何元素上:局部变量、接口类型、超类和接口实现类,甚至可以用在函数的异常定义上。
8) 新的包 java.time 包
包含了所有关于日期、时间、时区、持续时间和时钟操作的类;
这些类都是不可变的、线程安全的。

27、三次握手、四次挥手

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

四次握手

第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.
但是不能完全防范syn攻击。
TCP 四次挥手
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

TCP三次握手四次挥手详解

28、浏览器中输入:“www.xxx.com” 之后都发生了什么?请详细阐述。

  1. 由域名→IP 地址
    寻找 IP 地址的过程依次经过了浏览器缓存、系统缓存、hosts 文件、路由器缓存、 递归搜索根域名服务器。
  2. 建立 TCP/IP 连接(三次握手具体过程)
  3. 由浏览器发送一个 HTTP 请求
  4. 经过路由器的转发,通过服务器的防火墙,该 HTTP 请求到达了服务器
  5. 服务器处理该 HTTP 请求,返回一个 HTML 文件
  6. 浏览器解析该 HTML 文件,并且显示在浏览器端
  7. 这里需要注意:

HTTP 协议是一种基于 TCP/IP 的应用层协议,进行 HTTP 数据请求必须先建立 TCP/IP 连接

可以这样理解:HTTP 是轿车,提供了封装或者显示数据的具体形式;Socket 是发动机,提供了网络通信的能力。

两个计算机之间的交流无非是两个端口之间的数据通信 , 具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。

29、常见 HTTP 状态码

  1. 1xx(临时响应)
  2. 2xx(成功)
  3. 3xx(重定向):表示要完成请求需要进一步操作
  4. 4xx(错误):表示请求可能出错,妨碍了服务器的处理
  5. 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误
  6. 常见状态码:
  • 200(成功)
  • 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
  • 401(未授权):请求要求身份验证
  • 403(禁止):服务器拒绝请求
  • 404(未找到):服务器找不到请求的网页

30、TCP 和 UDP 的区别

  1. 回答发送数据前是否存在建立连接的过程;
  2. TCP过确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包;
  3. UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。既不拆分,也不合并,而是保留这些报文的边界,因 此,应用程序需要选择合适的报文大小;
  4. UDP 的头部,只有 8 个字节,相对于 TCP 头部的 20 个字节信息包的额外开销很小。

31、数据库的索引有什么作用?(必考) 底层数据结构是什么,为什么使用这种数据结构?

  1. 索引 是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;
  2. 底层数据结构是 B+ 树;
  3. 使用 B+ 树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。( 此时,你应该在白纸上画出什么是 B+ 树 )

32、事务的四大特性

  1. 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;
  2. 一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;
  4. 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存。

33、事务的并发问题有哪几种?

丢失更新、脏读、不可重复读以及幻读。

34、数据库中的锁有哪几种?

独占锁、排他锁以及更新锁。

35、数据库事务的隔离级别有哪几种?

读未提交、读已提交、可重复读和序列化。MySQL 事务默认隔离级别:可重复读

36、Spring AOP 的实现方式有哪几种?如何选择?

实现方式:JDK 动态代理实现和 cglib 实现

如何选择

  1. 如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP,也可以强制使用 cglib 实现 AOP;
  2. 如果目标对象没有实现接口,必须采用 cglib 库,Spring 会自动在 JDK 动态代理和 cglib 之间转换。

JDK 动态代理如何实现?

JDK 动态代理,只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。

  1. 定义一个实现接口 InvocationHandler 的类;
  2. 通过构造函数,注入被代理类;
  3. 实现 invoke( Object proxy, Method method, Object[] args)方法;
  4. 在主函数中获得被代理类的类加载器;
  5. 使用 Proxy.newProxyInstance( ) 产生一个代理对象;
  6. 通过代理对象调用各种方法。

37、Spring MVC流程

1、  用户发送请求至前端控制器DispatcherServlet。
2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、  DispatcherServlet调用HandlerAdapter处理器适配器。
5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、  Controller执行完成返回ModelAndView。
7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、  ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。

https://www.cnblogs.com/xiaoxi/p/6164383.html

38、Spring MVC原理分析

看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)

第一步:用户发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找

第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)

第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

第五步:处理器适配器去执行Handler

第六步:Handler执行完给处理器适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析

第九步:视图解析器像前端控制器返回View

第十步:前端控制器对视图进行渲染

第十一步:前端控制器向用户响应结果

看到这些步骤我相信大家很感觉非常的乱,这是正常的,但是这里主要是要大家理解springMVC中的几个组件:

前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。

处理器映射器(HandlerMapping):根据URL去查找处理器

处理器(Handler):(需要程序员去写代码处理逻辑的)

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)

视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

39、shell命令

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell

40、Dubbo底层采用Socket进行通信详解

Dubbo底层采用Socket进行通信详解

41、redis的部署方式:主从、集群。

42、redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里

43、SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。

在Spring中的类DefaultParameterNameDiscoverer (<version>2.0.2.RELEASE</version>):
public class DefaultParameterNameDiscoverer extends PrioritizedParameterNameDiscoverer {
    private static final boolean kotlinPresent =
            ClassUtils.isPresent("kotlin.Unit", DefaultParameterNameDiscoverer.class.getClassLoader());
    public DefaultParameterNameDiscoverer() {
        if (kotlinPresent) {
            addDiscoverer(new KotlinReflectionParameterNameDiscoverer());
        }
        addDiscoverer(new StandardReflectionParameterNameDiscoverer());
        addDiscoverer(new LocalVariableTableParameterNameDiscoverer());
    }
}
这个类是设置查找参数名方法的类,这里有三种
1.KotlinReflectionParameterNameDiscoverer:
看代码是判定是否为Kotlin,如果是就用这种,对于Kotlin我也不熟就没有细看
2.StandardReflectionParameterNameDiscoverer:
这是用java原生自带的反射原理获取参数名字
private String[] getParameterNames(Parameter[] parameters) {
        String[] parameterNames = new String[parameters.length];
        for (int i = 0; i < parameters.length; i++) {
            Parameter param = parameters[i];
            if (!param.isNamePresent()) {
                return null;
            }
            parameterNames[i] = param.getName();
        }
        return parameterNames;
    }
3.LocalVariableTableParameterNameDiscoverer
这是spring通过asm读取class字节码来获取方法的参数名字,具体的解释可以查看资料
所以Spring实际上是通过反射或者字节码读取获取方法的参数的名字的

44、SpringMVC 页面传递参数到controller的五种方式

一:直接将请求参数名作为Controller中方法的形参
public  String login (String username,String password)   :
解释:括号中的参数必须与页面Form 表单中的name 名字相同
二:使用@RequestParam 绑定请求参数参数值
举例:public String login(RequestParam ("username") String name) :
解释:双引号中的username 必须与页面vlaue名字相同,String name 中的name可以随便写
三:用注解@RequestMapping接收参数的方法
@RequestMapping(value="/login/{username}/{password}")
public String login(@PathVariable("username") String name,@PathVariable("password") String name)   
解释:上面的 @RequestMapping(value="/login/{username}/{password}") 是以注解的方式写在方法上的。注解上的usernname和 password 必须好页面上value 相同
四:使用Pojo对象(就是封装的类,类中封装的字段作为参数)绑定请求参数值,原理是利用Set的页面反射机制找到User对象中的属性
举例:@ReauestMapping(value=/login”)
    public String login(User user){
  解释:就是把封装的一个类当成一个参数放在方法中,封装类中的属性就是就是参数。
五:使用原生的Servlet API 作为Controller 方法的参数
public String login(HttpServletRequest request){
    String usernma=Request.getParameter("username");
}
解释:使用request 请求页面参数的方式获取从页面传过来的参数

45、Quartz是如何完成定时任务的

Quartz定时任务执行原理分析

46、自定义注解的实现

自定义注解的实现

47、Java的反射的用途及实现

Reflection 是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类和对象的内部属性。通过反射,我们可以在运行时获得程序或程序集中每一个类型成员和成员变量的信息。
程序中一般的对象类型都是在编译期就确定下来的,而Java 反射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象即使这个对象在编译期是未知的,
反射的核心:是 JVM 在运行时 才动态加载的类或调用方法或属性,他不需要事先(写代码的时候或编译期)知道运行对象是谁。

Java反射框架提供以下功能:

①、在运行时判断任意一个对象所属的类
②、在运行时构造任意一个类的对象
③、在运行时判断任意一个类所具有的成员变量和方法(通过反射设置可以调用 private)
④、在运行时调用人一个对象的方法

反射用途:

很多人都认为反射在实际Java中开发应用中并不广泛,其实不然。
当我们在使用 IDE(如 Eclipse\IDEA)时,当我们输入一个队长或者类并向调用它的属性和方法时,一按 (“.”)点号,编译器就会自动列出她的属性或方法,这里就会用到反射。

很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置 JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
举一个例子,在运用Struts 2框架的开发中我们一般会在struts.xml里去配置Action,比如:
<action name="login"
           class="org.ScZyhSoft.test.action.SimpleLoginAction"
           method="execute">
       <result>/shop/shop-index.jsp</result>
       <result name="error">login.jsp</result>
   </action>

配置文件与Action建立了一种映射关系,当View层发出请求时,请求会被StrutsPrepareAndExecuteFilter拦截,然后StrutsPrepareAndExecuteFilter会去动态地创建Action实例。

48、Java注解的用途、Java注解的用途

注解的用途:

1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
2、跟踪代码依赖性,实现替代配置文件功能。比如Dagger 2依赖注入,未来java开发,将大量注解配置,具有很大用处;
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

注解的用途:

注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。

49、JDBC的流程

第一步:加载Driver类,注册数据库驱动;
第二步:通过DriverManager,使用url,用户名和密码建立连接(Connection);
第三步:通过Connection,使用sql语句打开Statement对象;
第四步:执行语句,将结果返回resultSet;
第五步:对结果resultSet进行处理;
第六步:倒叙释放资源resultSet-》preparedStatement-》connection。

50、分布式数据库主键方案 详解

分布式数据库主键方案 详解

51、HashCode的作用原理和实例解析

HashCode的作用原理和实例解析

52、String/StringBuffer/StringBuilder的区别,实现?

String/StringBuffer/StringBuilder的区别,实现?

53、

54、

55、

56、

57、

58、

59、

60、

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值