![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java开发
文章平均质量分 59
catoop
性格开朗外向,积极进取充满热情,为人诚恳做事用心,爱好手工实践和大自然。有较强的自学意识创新意识和进取精神。喜欢分享技术收获,虽然是一个知识的搬运工,但对技术孜孜不倦,什么都想搞什么都想做的劲头小伙,善于灵活的运用技术优雅的解决问题,善于表达乐于沟通,一切只因心中那殿力量努力向上。
展开
-
Java Swing 桌面程序使用 GraalVM 封装为 exe 文件进行Native化
此步骤主要是因为Native Image对于Swing应用的运行时类监控存在缺陷,没有将必要的系统类加入到meta信息中,需要手工补充进去,否则在完成编译后运行文件时会报错找不到类。这种也是最不会出问题的,因为它底层最终就是一个解压缩还原过程。等),将 dll、exe 及相关文件封装成一个单一的 exe 文件,最终效果就是只有一个 exe 文件了,这样传播和发送会更方便。我的这个 Swing 程序,是一个小工具,依赖了两个第三方 jar 包,一个是日期选择控件,另一个是界面风格的库。原创 2024-04-28 17:29:54 · 899 阅读 · 0 评论 -
Java 获取网卡的 MAC 地址
【代码】Java 获取网卡的 MAC 地址。原创 2024-03-12 15:41:23 · 135 阅读 · 0 评论 -
基于 JavaAgent 代理技术实现 class 字节码插桩(bytebuddy)
先描述一个场景,生产有一个正在运行的java项目,以某 springboot-service.jar 为例,项目发布后发现了某个http接口响应较慢,此时你希望定位这个http接口执行过程中依次调用的几个主要方法的分别执行耗时,用来作为进一步解决问题的依据。你应该怎么做?Java Agent 技术常被用于加载class文件之前进行拦截并修改字节码,以实现对Java应用的无侵入式增强。原创 2024-03-08 09:36:58 · 727 阅读 · 1 评论 -
JWT基于Cookie的会话保持,并解决CSRF问题的方案
避免CSRF问题可以通过自定义Header方式的处理,所以我们可以在使用Cookie记录JWT的基础上,增加一个无实际意义并且唯一的sessionId,每个接口调用都使用自定义Header SID传递该值,在服务端使用过滤器或者拦截器验证SID的值是否和JWT中的值一致。使用JWT进行浏览器接口请求,在使用Cookie进行会话保持传递Token时,可能会存在 CSRF 漏洞问题,同时也要避免在产生XSS漏洞时泄漏Token问题,如下图在尽可能避免CSRF和保护Token方面设计了方案。原创 2024-02-26 11:04:53 · 294 阅读 · 0 评论 -
搭建 idea 插件仓库私服
正常情况下,我们开发的 idea 插件会发布到 idea 官方商城中,这样用户就可以在 idea 的 Marketplace 中搜索安装。但是在企业内部,有可能我们开发了很多内部插件,而不能发布到公共市场中,这种情况下我们就需要搭建一个内部的插件私服,本文讲述如何自己配置一个插件私服。原创 2024-02-01 19:37:54 · 761 阅读 · 0 评论 -
netty 自定义 NioServerSocketChannel、NioSocketChannel、DefaultChannelPipeline和HeadContext
【代码】netty 自定义 NioServerSocketChannel、NioSocketChannel、DefaultChannelPipeline和HeadContext。原创 2023-12-12 17:03:27 · 136 阅读 · 0 评论 -
Java 中使用装饰器模式 wrapped 一个不能被重写的父类中的接口方法
我们在 ClassB 中声明了一个 wrapped 变量,完全重新实现了接口 InterfaceA,重点是我们在所有的接口方法中,直接调用 ClassB 的所有对应方法,这样就相当于 wrapped 装饰了原来 ClassB 实例中的 InterfaceA,此时我们只需要对 show1 进行复写自己的逻辑即可,其他方法原样返回。在开发中,有时候使用第三方框架时,我们因为特殊需求,需要继承框架中的一个Java类重写它的某个方法来达到期望的目的。原创 2023-12-12 16:08:10 · 170 阅读 · 0 评论 -
常见Bean拷贝框架使用姿势及性能对比
Bean属性拷贝,主要针对几个常用的拷贝框架进行性能对比,以及功能扩展支持选用的框架。转载 2023-12-06 15:13:37 · 99 阅读 · 0 评论 -
ASCII码对照表
ASCII编码即美国信息交换标准代码(American Standard Code for Information Interchange)是一套共有128个字符的编码,它基于阿拉丁字母,主要作用是用来表示英语和西欧语言字符。ASCII规范编码第一次公布于1967年,ascii码在1986年完成最后一次更新。ASCII码对照表等同于国际标准 ISO/IEC 646,ASCII码对照表是世界最通用的信息交换标准。原创 2023-12-06 08:58:21 · 366 阅读 · 0 评论 -
Netty中Pipeline的ChannelHandler执行顺序案例详解
1、InboundHandler是通过fire事件决定是否要执行下一个InboundHandler,如果哪个InboundHandler没有调用fire事件,那么往后的Pipeline就断掉了。2、InboundHandler是按照Pipleline的加载顺序,顺序执行。3、OutboundHandler是按照Pipeline的加载顺序,逆序执行。4、有效的InboundHandler是指通过fire事件能触达到的最后一个InboundHander。转载 2023-11-10 09:17:36 · 272 阅读 · 0 评论 -
Netty PipeLine 注意事项总结
1、InboundHandler是通过fire事件决定是否要执行下一个InboundHandler,如果哪个InboundHandler没有调用fire事件,那么往后的Pipeline就断掉了。2、InboundHandler是按照Pipleline的加载顺序,顺序执行。3、OutboundHandler是按照Pipeline的加载顺序,逆序执行。4、有效的InboundHandler是指通过fire事件能触达到的最后一个InboundHander。原创 2023-11-09 19:50:47 · 220 阅读 · 0 评论 -
maven 添加 checkstyle 插件约束代码规范
【代码】maven 添加 checkstyle 插件约束代码规范。原创 2023-11-06 16:41:19 · 749 阅读 · 0 评论 -
base64字符串转文件代码示例
需要输入的 txt 文件中,以行为单位存储了分段的base64字符串,每行最前面的序号指拆分base64大字符串的分段顺序。原创 2023-11-06 15:22:24 · 186 阅读 · 0 评论 -
HTTP 协议请求头 If-Match、If-None-Match 和 ETag
在 HTTP 协议中,请求头If-MatchIf-Range主要是为了解决浏览器缓存数据而定义的请求头标准,按照协议规范正确的判断和使用这几个请求头,可以更精准的处理浏览器缓存,从而达到提高系统性能和减少系统带宽的占用的目的。1、 减少了网络交互,加快页面响应速度,增强用户体验;2、 减少了网络带宽消耗,因为没有更新的资源就不需要重复返回了,特别是图片、视频、下载文件这类大响应体请求;当请求中存在上述If-xxx。原创 2023-11-02 11:28:55 · 2685 阅读 · 0 评论 -
微信公众号5秒内响应success的最佳处理方案
本着对编码精益求精的态度,我的做法是做精准时间处理,我以4秒为限,如果4秒以内可以处理完自己的业务逻辑,则直接返回对应需要响应给用户的消息,反之直接返回success。结合这两点内容我们能很显然的得出结论:如果我们可以通过1来完成那绝对不做2,毕竟2多了一次主动调用微信接口的操作,在一定程度上加大了我们系统的资源消耗。但是在实际业务中,即便是我们的业务处理,正常情况不会超过5秒这么久,但是系统总有可能有例外情况,我们总要考虑可能出现哪怕5%可能超出5秒的情况。以上两份代码,我都做了测试,应该没有问题。原创 2023-10-28 23:17:04 · 551 阅读 · 0 评论 -
Sonar:Either re-interrupt this method or rethrow the “InterruptedException“ that can be caught here.
这么提醒是为了告诉我们,在异常被捕获后,应该重新设置 interrupt 状态为 true,为后续判断 interrupt 状态的地方使用(在本文示例中就是 while 的地方会继续使用),以确保代码逻辑的正确。其实这跟线程 interrupt() 的处理机制有关,当你主动调用 interrupt() 后,会触发 InterruptedException 异常,但是线程在抛出 InterruptedException 异常时,会重置 interrupt 的状态为 false。2、在主线程中调用了子线程的。原创 2023-10-28 19:56:44 · 3317 阅读 · 0 评论 -
idea 插件 checkstyle 规则示例和说明
使用插件最后附我个人使用的一个xml(上面那个xml是比较全的解释)(END)原创 2023-10-25 11:55:09 · 1211 阅读 · 0 评论 -
SpringBoot - Google EventBus、AsyncEventBus
EventBus 顾名思义,事件总线,是一个轻量级的发布/订阅模式的应用模式,最初设计及应用源与 google guava 库。相比于各种 MQ 中间件更加简洁、轻量,它可以在单体非分布式的小型应用模块内部使用(即同一个JVM范围)。原创 2023-08-30 17:47:27 · 747 阅读 · 0 评论 -
Camunda 工作流节点跳转 - 多实例节点判断和跳转
指令时不会考虑集合,并且不会为附加实例填充集合元素变量,针对这种情况,需要使用下面的处理方法。第2点,基于集合的多实例跳转节点的跳转时,需要在节点Id后追加特定字符串。注:对于目标节点是多实例的节点,如果不在节点Id后面追加框架约定的字符串。在多种工作流引擎中,Camunda框架对流程的处理控制更为强大、灵活。1、单实例节点,或者不是基于集合配置的多实例节点。如果多实例活动是基于集合配置的,则执行。,则不能自动执行触发多实例节点配置的。原创 2023-08-23 13:53:29 · 1851 阅读 · 3 评论 -
基于EasyExcel的单元格合并自定义算法处理
*** Excel 行合并策略//上一行 private Row beforeRow = null;//合并规则(多个) private List < ExcelMergeStrategyModel > strategyList;//总行数(不含表头) private int dataRowTotalSize;//当前已经处理的行数(不含表头) private int dataRowCurrentSize = 0;} /*** 构造方法。原创 2023-07-15 15:17:31 · 1048 阅读 · 0 评论 -
JMH - Java代码基准测试工具,代码性能问题验证测试
在日常开发工作当中,开发人员可能有这些困惑:自己写的这个方法性能到底怎么样?在原接口实现方法中添加了新的业务逻辑,对整个接口的性能影响有多少?有多种实现方式(或开源类库),到底哪一种性能更好?当遇到类似困惑或者说问题的时候,怎么办呢?当然是测试验证,实践出真知!本文讲述的就是一个方法级别的性能测试工具—— JMH。JMH,即 Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。何谓Micro Benchmark呢?原创 2023-07-07 16:05:06 · 1647 阅读 · 0 评论 -
freemarker+itextpdf 生成 pdf
其中 freemarker 生成 html 片段省略,本文直接用 html 生成 pdf。1、添加 itextpdf 依赖。原创 2023-06-06 15:08:06 · 967 阅读 · 0 评论 -
Java文件内容变更及内容追加监听方案
对于文件内容变动的监听处理,一般分为两种主要应用场景。1、只关心文件内容是否发生变更文件的内容发生变动的场景是全量修改模式,不是内容追加模式。例如某xml文件内容发生变动。这种情况,我们一般只需要监听文件内容是否发生修改,在监听到内容变更后触发业务逻辑对整个文件进行重新加载处理。2、关心文件新增的内容这种场景是指文件的内容只会被追加而对文件之前的内容不会产生影响。在文件内容被持续追加时,需要及时获取文件被追加的内容,并将这些内容入库或者进一步处理的场景。例如日志文件这种场景。原创 2023-04-04 15:07:31 · 1061 阅读 · 0 评论 -
将浏览器请求直接导入到 Postman Apifox 中
应用场景就是浏览器 F12 debug 到的请求,可以直接拷贝为 cURL 请求,拷贝的内容,包含了 请求头、参数、请求体所有内容,可以直接在 Linux 命令行直接粘贴使用。因为 Postman、Apifox 这种接口调试工具自身提供了 cURL 导入功能,所有我们才可以直接把 copy 的内容导入到接口调试工具中。我估计有很多用户,遇到这种场景时,都是一个一个 header 和参数复制到接口调试工具中的(很麻烦),刚好用这种方法可以完美的快速使用。方法就是如下图所示,好像不需要过多文字来赘述了。原创 2023-02-10 10:43:04 · 1487 阅读 · 0 评论 -
Prometheus 四大指标类型
Prometheus的指标有四种类型,分别是Counter,Gauge,Histogram,Summary。Counter只增不减的计数器,用于描述某个指标的累计状态,比如请求量统计,http_requests_total。重启进程后会被重置。Gauge可增可减的计量器,用于描述某个指标当前的状态,比如系统内存余量,node_memory_MemFree_bytes。重启进程后会被重置。Histogram。原创 2022-10-25 15:40:11 · 1876 阅读 · 0 评论 -
Java 精简字体 ttf 文件(精简后的字体文件只包含需要的文字字符)
因为字体文件源文件中包含了所有的汉字和字符,而我们这个文件中要写入的公司名称需要的文字是有限的,如果我们不对这个字体文件进行精简(只包含我们需要的文字),则生成的 ofd 文件会很大(包含了整个字体),这显然不是最佳结果,所以对字体文件进行精简只保留需要的文字才是最优解。例如某字体文件 myfont.ttc 源文件的大小为 17MB,现需要制作的 ofd 文档中需要使用这种字体来显示所有的公司名称。App 中需要内置字体文件,制作 pdf、ofd 等文件需要内置字体时,并且能明确知道已知文字内容的情况下。原创 2022-09-29 18:01:36 · 1067 阅读 · 0 评论 -
freemarker 和 openhtmltopdf 生成 pdf Demo
freemarker 和 openhtmltopdf 生成 pdf Demo原创 2022-09-28 16:56:52 · 1998 阅读 · 4 评论 -
freemarker 生成 pdf Demo
freemarker 生成 pdf Demo原创 2022-09-28 14:50:24 · 852 阅读 · 0 评论 -
freemarker 转 pdf 表格分页被截断、分页标记和中文不显示问题
freemarker 转 pdf 表格分页被截断、分页标记和中文不显示问题原创 2022-09-28 14:18:21 · 2823 阅读 · 2 评论 -
java pdf 转 ofd
本文转换以 ofdrw 为基础,使用 spire 免费版将 pdf 转换为 ofd。原创 2022-09-27 20:09:24 · 1230 阅读 · 0 评论 -
Java8 中 Collectors 中 partitioningBy 与 groupingBy 区别
Java8 中 Collectors 中 partitioningBy 与 groupingBy 区别名称原型区别partitioningByCollector<T, ?, Map<Boolean, List>> partitioningBy(Predicate<? super T> predicate)将一组数据分为两组,key 为 ture 和 false 的两组数据(仅能分为两组)groupingByCollector<T,原创 2022-05-18 14:22:40 · 504 阅读 · 0 评论 -
Srping 响应式框架 WebFlux 的性能小测试_WebClient连接池
平时只是听说 Spring WebFlux 性能在高并发的 HTTP 场景下效果比较明显,但是一直没有亲自验证一下。本文用了一个及其简单的例子,使用 Jmeter 做了一下压测,过程和效果如下图所示:先对测试的环境做一个描述,为了减少其他任何因素导致的干扰,创建了一个基础干净的工程:1、使用 idea 创建一个初始化的 spring-boot 项目2、添加一个 Controller 填写2个方法,一个是使用 Servlet 模式的,一个是使用 WebFlux 模式的3、没有做任何其他配置4、使用原创 2022-05-13 16:54:03 · 1101 阅读 · 0 评论 -
GPG入门教程
GnuPG软件(简称GPG),它是目前最流行、最好用的加密工具之一。一、什么是GPG要了解什么是GPG,就要先了解PGP。1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置,请参考Ubuntu网站的介转载 2022-05-12 16:13:36 · 1171 阅读 · 0 评论 -
WebFlux 框架对 request 的 InputStream 和 response 的 OutputStream 的使用
说到 WebFlux 就要提到和对比 Servlet,这样也是为了保留和尽量靠近以前代码的实现逻辑,所以最常用的就是对请求的输入流和响应的输出流处理。在 Servlet 中获取输入流和输出流HttpServletRequest request;HttpServletResponse response;InputStream inputStream = request.getInputStream();OutputStream outputStream = response.getOutputSt原创 2022-05-12 13:43:09 · 1582 阅读 · 1 评论 -
maven 打包包含sources源码和doc文档
当我们需要将开发的一个开源项目 deploy 到 Maven 中央仓库时,发布过程中系统会检查要求提供源码包和Javadoc包的,这是为了使用者可以在IDE中直接进入该依赖的源码查看实现细节(话说你不开源还往中央仓库发不是违背了开源共享的精神吗)。pom 插件配置按如下填写: <plugins> <plugin> <groupId>org.apache.maven.plugins</group原创 2022-05-12 09:05:25 · 1286 阅读 · 1 评论 -
spring webflux 和 webservice 同一个工程
基于 SpringBoot 创建一个 SOAP WebService 服务的步骤之前发布过在 springboot 中基于 jaxws 发布 WebService 的文章,是基于注解式的(cxf封装过的starter)。如果你的 springboot 使用的是 reactor 的 webflux 模式开发的,使用那种方式会出现不兼容的问题。本文示例是在应用 webflux 的 springboot 中发布 WebService。1.初始化一个原始的 springboot 工程创建一个基础的 spr原创 2022-05-09 19:54:32 · 407 阅读 · 1 评论 -
Java 字节数组/字符串 工具类 BytesUtils
import java.io.UnsupportedEncodingException;import java.nio.charset.StandardCharsets;/** * 二进制工具类 */public class BytesUtils { private BytesUtils() { } /** * 将 long 值转为8字节的二进制数组; * * @param value 要转换的long整数; * @param原创 2022-05-09 16:07:22 · 939 阅读 · 0 评论 -
Java 字节数组/字符串 工具类 BytesUtils
import java.io.UnsupportedEncodingException;import java.nio.charset.StandardCharsets;/** * 二进制工具类 */public class BytesUtils { private BytesUtils() { } /** * 将 long 值转为8字节的二进制数组; * * @param value 要转换的long整数; * @param原创 2022-05-07 09:14:26 · 1085 阅读 · 0 评论 -
map 和 flatMap 区别
区别这两个在本质上是一样的,都是 map 操作,即对流形式的传入数据进行处理返回一个数据。但是区别方面从字面上就可以体现出来,flatMap 比 map 多了一个 flat 操作,也就是 “展平/扁平化” 处理的意思。所以 flatMap 是一个 map 和一个 flat 操作的组合。其首先将一个函数应用于元素,然后将其展平,当你需要将 [[a,b,c],[d,e,f],[x,y,z]] 具有两个级别的数据结构转换为 [a,b,c,d,e,f,x,y,z] 这样单层的数据结构时,就选择使用 flatMa原创 2022-05-05 14:04:04 · 19898 阅读 · 4 评论 -
Word docx 内部的 Dom 节点说明
docx 格式的 word,其内部结构为 xml 格式的 dom 结构,如果需要对 docx 文件进行代码级的操作,在了解其 dom 结构的前提下,是可以直接操作 xml 文件内容来实现对 docx 文档本身进行读取和修改的。使用 POI 库获取 docx 文档 dom 对象的代码为:new XWPFDocument(inputStream).getDocument().getDomNode()dom 中的节点含义说明如下:<w:p> <!--表示一个段落--><w翻译 2022-04-20 11:18:19 · 624 阅读 · 0 评论