当前位置:网站首页 > 技术博客 > 正文

java编写软件



除了我们前面提到的 Java 原生工具类,比如说 Arrays、Objects、Collections、Scanner 等,还有一些第三方的工具类,比如说 Hutool、Guava 等,以及我们今天介绍的 IpUtil、CollectionUtils、StringUtils、MDC、ClassUtils、BeanUtils、ReflectionUtils 等等,在很大程度上能够提高我们的生产效率。

当然了,如果能好好看一下它们的源码,对技术功底的提升,也是有很大帮助的。

获取本机 IP 算是比较常见的一个需求场景了,比如业务报警,可能就会带上出问题的机器 IP,方便直接上去看日志定位问题,那么问题来了,如何获取机器 IP 呢?

如何获取机器 IP?如果了解 InetAddress 这个工具类,就很容易写出一个简单的工具类,如下

上面的实现有问题么?

当然没问题,拿我本机和阿里服务器执行一下,并没有问题如实的输出了预期的 IP

本机执行后截图如下:

阿里云机器执行后截图如下:

做一点简单的改动,获取 IPV4 的地址,源码如下

需要注意的是,这段代码只返回本机的 IPv4 地址,并且只返回第一个符合条件的地址。如果本机有多个网络接口或者每个接口有多个地址,则可能无法返回预期的地址。此外,如果找不到任何 IPv4 地址,则会返回本地主机地址。

再次测试,输出如下

IPUtil 类中定义了两个方法,分别是 和 。前者是获取本机的内网 IPv4 地址,避免了返回 127.0.0.1 的问题。后者是获取本地主机地址,如果本机有多个 IP 地址,则可能返回其中的任意一个。

是 包下的一个类,它的全称是 Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。

MDC 的底层是用了 来保存数据的。

我们可以用它传递参数。

例如现在有这样一种场景:我们使用调用远程接口时,有时需要在中传递信息,比如:traceId,source 等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。

这种业务场景就能通过接口实现,具体做法如下:

第一步,定义一个 LogFilter 拦截所有接口请求,在 MDC 中设置 traceId:

第二步,实现接口,MDC 中获取当前请求的 traceId,然后设置到 header 中:

第三步,定义配置类,配置上面定义的类:

其中 MdcUtil 其实是利用 MDC 工具在 ThreadLocal 中存储和获取 traceId

当然,这个例子中没有演示 MdcUtil 类的 add 方法具体调的地方,我们可以在 filter 中执行接口方法之前,生成 traceId,调用 MdcUtil 类的 add 方法添加到 MDC 中,然后在同一个请求的其他地方就能通过 MdcUtil 类的 get 方法获取到该 traceId。

能使用 MDC 保存 traceId 等参数的根本原因是,用户请求到应用服务器,Tomcat 会从线程池中分配一个线程去处理该请求。

那么该请求的整个过程中,保存到 MDC 的 ThreadLocal 中的参数,也是该线程独享的,所以不会有线程安全问题。

spring 的包下的类,它里面有很多让我们惊喜的功能。

它里面包含了类和对象相关的很多非常实用的方法。

如果你想获取某个对象的所有接口,可以使用 ClassUtils 的方法。例如:

如果你想获取某个类的包名,可以使用 ClassUtils 的方法。例如:

如果你想判断某个类是否内部类,可以使用 ClassUtils 的方法。例如:

如果你想判断对象是否代理对象,可以使用 ClassUtils 的方法。例如:

ClassUtils 还有很多有用的方法,等待着你去发掘。感兴趣的小伙伴,可以看看下面的内容:

Spring 给我们提供了一个的工具类,它在包下面,它的名字叫做:。

让我们一起看看这个工具可以带给我们哪些惊喜。

曾几何时,你有没有这样的需求:把某个对象中的所有属性,都拷贝到另外一个对象中。这时就能使用 BeanUtils 的方法。例如:

如果你想通过反射实例化一个类的对象,可以使用 BeanUtils 的方法。例如:

如果你想获取某个类的指定方法,可以使用 BeanUtils 的方法。例如:

如果你想获取某个方法的参数,可以使用 BeanUtils 的方法。例如:

如果你对 BeanUtils 比较感兴趣,可以看看下面内容:

有时候,我们需要在项目中使用功能,如果使用最原始的方法来开发,代码量会非常多,而且很麻烦,它需要处理一大堆异常以及访问权限等问题。

好消息是 Spring 给我们提供了一个工具,它在包下面。

如果你想获取某个类的某个方法,可以使用 ReflectionUtils 类的方法。例如:

如果你想获取某个类的某个字段,可以使用 ReflectionUtils 类的方法。例如:

如果你想通过反射调用某个方法,传递参数,可以使用 ReflectionUtils 类的方法。例如:

如果你想判断某个字段是否常量,可以使用 ReflectionUtils 类的方法。例如:

如果你想判断某个方法是否 equals 方法,可以使用 ReflectionUtils 类的方法。例如:

当然这个类还有不少有趣的方法,感兴趣的朋友,可以看看下面内容:

参考链接:https://juejin.cn/post/ 作者:苏三,编辑:沉默王二


GitHub 上标星 10000+ 的开源知识库《二哥的 Java 进阶之路》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:太赞了,GitHub 上标星 10000+ 的 Java 教程

微信搜 沉默王二 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 222 即可免费领取。

  • 上一篇: 预测模型的作用
  • 下一篇: C语言计算机二级
  • 版权声明


    相关文章:

  • 预测模型的作用2024-12-18 13:01:07
  • c++游戏编程教程2024-12-18 13:01:07
  • mysql创建表命令2024-12-18 13:01:07
  • linux fdisk -l命令2024-12-18 13:01:07
  • 防抖技术2024-12-18 13:01:07
  • C语言计算机二级2024-12-18 13:01:07
  • getline(infile,line)2024-12-18 13:01:07
  • 大数据用户画像的核心技术2024-12-18 13:01:07
  • d3qn算法2024-12-18 13:01:07
  • 归并排序算法分析2024-12-18 13:01:07