这是两个月前在工作中遇到的问题,重构的项目引入了swagger,但是有些地方swagger的实现并不完善,譬如,在没有指定bean的字段的数据类型时,swagger默认当做String处理,而实际上可能是Integer或者Long,这时就会抛出NumberFormatException,虽然并不影响使用,但是看到这样的日志也会很不爽。于是新建了同名目录,将报错的类修改了一行代码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/eed693cda383485e9000df1f92d9d221.jpeg#pic_center
但是,为什么这样可以覆盖jar包中的类呢?
最开始是刚工作的时候,见到有的老人这样搞,来实现一些骚操作,个人一直是知其然不知所以然。
搜索了一下,找到这几篇文章:
jvm之java类加载机制和类加载器(ClassLoader)的详解
一文搞懂双亲委派模型
通俗易懂的双亲委派机制
借文中的这张图来理解
简单讲就是,这是利用了java的类加载机制。jvm在加载类的时候,会使用递归的方式,一遍一遍的寻找这个类的父类,加载父类也就是将父类读取进缓存,当其他类也继承相同父类时,会首先从缓存中寻找是否已经存在相同的类。这是一个自上至下的加载过程。
按照这种规则,将从项目中自己定义的类开始,向下层递归找到父类,再开始加载。在这里,项目中自己定义的类就属于顶层调用,引入的jar包、运行的jre,都属于底层调用。因此自己定义的类就可以覆盖底层的jar包的类了。