![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 87
不学无数的程序员
这个作者很懒,什么都没留下…
展开
-
关于加解密、加签验签的那些事
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口,或者安全性要求高的系统,那么必然会接触到这些名词。所以加解密、加签验签对于一个合格的程序员来说是必须要掌握的一个概念。那么加解密相关的密码学真的离我们很遥远吗?其实生活中有很多常见的场景其实都用到了密码学的相关知识,我们不要把它想得太难,例如在《睡在我上铺的兄弟》这一段中作弊绕口令中,.原创 2020-05-12 18:29:02 · 849 阅读 · 0 评论 -
只需要这三步,用Java也能图片识别
最近闲来无事研究了一下用Java如何模拟浏览器的行为,在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于Java如何进行图片识别验证码,由于根据网上查找的相关文章都不适合我的配置,所以特开此博客进行记录一下采坑的过程以及解决方法。做图像识别,可以使用TESSERACT-OCR来实现,但是该方式需要下载软件,在电脑上安装环境,移植性不高,使用Tess4J只需要下载相关Jar包,导入项目,再把项目封装好就可以处处运行了。首先说一下我使用的电脑和JDK版本电脑:MacBookJDK版本:1.原创 2020-05-10 17:08:09 · 1340 阅读 · 0 评论 -
Java中的屠龙之术——如何修改语法树
在Lombok经常用,但是你知道它的原理是什么吗?,和Lombok经常用,但是你知道它的原理是什么吗?(二)两篇文章中介绍了关于Lombok的底层原理,其实总结为一句话来说就是在编译期通过改变抽象语法树而实现的。上面两篇文章已经讲了抽象语法树的相关知识点,如果有不清楚的可以看一下。本篇涉及到的所有代码都在github上面有本篇涉及到的所有代码都在github上面有本篇涉及到的所有代码都在g...原创 2020-03-26 15:09:18 · 1750 阅读 · 4 评论 -
如何快速对接Stripe国际支付系统
Stripe国际支付介绍Stripe是由20多岁的两兄弟Patrick Collison和John Collison创办的Stripe为公司提供网上支付的解决方案。Stripe向服务的公司收取每笔交易的2.9%加上30美分的手续费。很多中国卖家想要借用stripe来实现建站收款,Stripe现在被称为“移动时代PayPal”。目前服务的客户有大家熟知的facebook、Twitter、Sh...原创 2020-03-14 16:45:38 · 3699 阅读 · 3 评论 -
Lombok经常用,但是你知道它的原理是什么吗?(二)
在上一篇Lombok经常用,但是你知道它的原理是什么吗?简单介绍了注解处理器,是用来处理编译期的注解的一个工具,我们只是自己生成了一些代码,但是和Lombok却不一样,因为Lombok是在原有类的基础上增加了一些类,你那么Lombok是如何做到修改原有类的内容呢?接下来我们就再进一步了解Lombok的原理。Javac原理既然我们是在编译期对类进行操作了,那么我们就需要了解在Java中Javac...原创 2020-03-05 15:01:48 · 277 阅读 · 0 评论 -
Lombok经常用,但是你知道它的原理是什么吗?
相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省...原创 2020-02-26 16:43:16 · 565 阅读 · 0 评论 -
《沙盘模拟系列》JVM如何调优
纸上得来终觉浅 绝知此事要躬行我所在的公司基本上是没有机会进行JVM参数调优的,但是如果有些东西自己不亲身经历一下,看再多的理论知识也只能算是纸上谈兵,真正碰到问题的时候还是不知道该怎么分析。所以就自己制造一些问题然后看其现象,利用所学的知识事前推测,看现象是不是和自己推测的一样。这样不仅对自己所学的知识又是一次巩固,而且也能锻炼自己解决问题的能力(虽然问题是自己制造的)。其实在写这篇文章...原创 2019-12-29 14:09:47 · 194 阅读 · 0 评论 -
几百万数据放入内存不会把系统撑爆吗?
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存...原创 2019-12-21 16:49:33 · 3618 阅读 · 4 评论 -
死磕Tomcat系列(5)——容器
死磕Tomcat系列(5)——容器回顾在死磕Tomcat系列(1)——整体架构中我们简单介绍了容器的概念,并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——EndPoint源码解析中,我们知道了连接器将请求过来的数据解析成Tomcat需要的ServletRequest对象给容器。那么容器又是如何将这个对象准确的分到到对应的请求上去的呢?容器的整体设计C...原创 2019-07-08 17:23:23 · 128 阅读 · 0 评论 -
关于Redis热点key的一些思考
关于Redis热点key的一些思考昨天在和一个已经跳槽的同事聊天时,询问他这段时间面试时碰到的一些问题。自己也想积累一下这方面的知识。其中他说了在面试某赞公司时面试官问他关于热点Key的的解决方案。于是针对这次谈话以及上网查的一些资料后的思考进行一下总结。方便后续自己查阅。什么是热点Key其实对于热点Key,网上一查一大堆,这里我就引用网上的一段话。从基于用户消费的数据远远大于生产的数据的...原创 2019-07-10 15:42:39 · 155 阅读 · 0 评论 -
死磕Tomcat系列(4)——Tomcat中的类加载器
死磕Tomcat系列(4)——Tomcat中的类加载器在学习Tomcat中的类加载器,并且Tomcat为什么要实现自己的类加载器打破双亲委派模型原因之前,我们首先需要知道Java中定义的类加载器是什么,双亲委派模型是什么。Java中的类加载器类加载器负责在程序运行时将java文件动态加载到JVM中从Java虚拟机的角度来讲的话,存在两种不同的类加载器:启动类加载器(Bootstr...原创 2019-07-05 15:36:30 · 308 阅读 · 0 评论 -
如何自己手写一个热加载
如何自己手写一个热加载热加载:在不停止程序运行的情况下,对类(对象)的动态替换Java ClassLoader 简述Java中的类从被加载到内存中到卸载出内存为止,一共经历了七个阶段:加载、验证、准备、解析、初始化、使用、卸载。接下来我们重点讲解加载和初始化这两步加载在加载的阶段,虚拟机需要完成以下三件事:通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的...原创 2019-07-15 17:54:42 · 190 阅读 · 0 评论 -
死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的
死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在Web容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重新加载类,这个过程不会清空Session。而在生产环境我们一般应用的是热部署,热部署也是在Web应用后...原创 2019-07-11 18:14:14 · 1145 阅读 · 0 评论 -
自定义Docker容器镜像并将其上传到DockerHub中
自定义Docker容器镜像并将其上传到DockerHub中Docker从2013年发布至今,一直是广受瞩目,所以我们或多或少也应该了解一些Docker的技术原理,而学习一项技术有了兴趣才能更好的让你持续学习下去。如果让你体会到Docker的神奇之处那么兴趣或许会大一点,接下来我们就先从自定义一个自己的Docker容器镜像来开启学习Docker的第一步。自定义Docker容器镜像在开始我们的...原创 2019-07-12 16:55:16 · 387 阅读 · 0 评论 -
批量测试Mybatis项目中Sql是否正确
去Oracle行动最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql。公司的数据库交互层面使用的是Mybatis,而Oracle与Mysql也有一些语法上的不同。所以在项目中的Sql要改动,但是多个项目中涉及到的Sql非常多,如果仅凭人工一条一条辨别的话,工作量有点大。所以就萌发出了直接将数据源变为Mysql,利用反射批量执行Mapper中的...原创 2019-07-12 16:56:21 · 463 阅读 · 0 评论 -
Mac上最简单明了的利用Docker搭建Redis集群
Mac上最简单明了的利用Docker搭建Redis集群本文只是记录一下我在Mac上利用Docker搭建Redis集群成功后的步骤,期间走了许多的坑。有许多教程对于Mac用户不友好,搭建成功以后无法进行集群间的通信。首先说明一下有多简单,如果你机器上已经有了Docker,那么就一个步骤就行。如果没有Docker那么在Docker下载下载一个就行。接下来我们就开始进行Redis集群的搭建。首先...原创 2019-07-12 16:57:10 · 667 阅读 · 0 评论 -
Java8——异步编程
Java8——异步编程异步编程所谓异步其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法创建任务并执行任务无参创建 CompletableFuture<String> noArgsFuture = new CompletableFuture<>();传入相应任务,无返回值runAsync方法可以在后台执行异步计算,但是此时并没有返回值。持有...原创 2019-08-08 20:57:59 · 593 阅读 · 0 评论 -
压缩20M文件从30秒到1秒的优化过程
压缩20M文件从30秒到1秒的优化过程有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,耗费的时间也在急剧增加,最后测了一下压缩20M的文件竟然需要30秒的时间。压缩文件的代码如下。public static vo...原创 2019-08-16 11:49:13 · 127 阅读 · 0 评论 -
后端框架开发需要注意的几点
后端框架开发需要注意的几点笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽跌跌撞撞了在程序员的道路上也有一年的时间了,慢慢的觉得这一年的工作大部分时间都是在简单的CRUD中度过,而有时候我们在CRUD中有多少重复性的代码呢?有些代码我们每次写都需要重复性的写一次,不仅浪费时间,而且对于自己提升并没有多大的提高。无意中看到了程序员你为什么这么累文章后,才幡然醒悟,为什么我们工作这么久了不...原创 2019-09-03 20:49:14 · 311 阅读 · 0 评论 -
死磕Tomcat系列(3)——Tomcat如何做到一键式启停的
死磕Tomcat系列(3)——Tomcat如何做到一键式启停的在没有SpringBoot内嵌有Tomcat之前,我们都是将项目打为War包放在Tomcat的webapp目录下面,然后如果是Linux系统,运行命令start.sh、如果是Windows系统,运行命令start.bat以后就能启动起来并访问到页面。如果是想要停止运行只需要运行shutdown.sh或者shutdown.bat就能将程...原创 2019-06-26 17:14:50 · 274 阅读 · 0 评论 -
死磕Tomcat系列(2)——EndPoint源码解析
死磕Tomcat系列(2)——EndPoint源码解析在上一节中我们描述了Tomcat的整体架构,我们知道了Tomcat分为两个大组件,一个连接器和一个容器。而我们这次要讲的EndPoint的组件就是属于连接器里面的。它是一个通信的端点,就是负责对外实现TCP/IP协议。EndPoint是个接口,它的具体实现类就是AbstractEndpoint,而AbstractEndpoint具体的实现类就...原创 2019-06-25 11:20:34 · 241 阅读 · 0 评论 -
不学无数——Java中IO和NIO
JAVA中的I/O和NIOI/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。什么是I/OI/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有 I/O...原创 2018-09-21 17:51:49 · 97 阅读 · 0 评论 -
不学无数——装饰模式
装饰模式在开始之前我们可以用一个简单的例子引出来装饰模式,在小的时候,相信大家都有过这样的经历:小学每年会有好几次的考试,如果有一次成绩非常差,而且考完以后学校会有个很损的招,就是打印出来成绩单,然后让家长签字。那么拿着这个成绩单,肯定是不会直接告诉家长成绩什么的,肯定是会加一些,例如,语文考了65,就会说我们班最高的才75。如果成绩单没有排名的话,那么也会添油加醋的说排名靠前,这样父母的就会...原创 2018-09-18 19:06:57 · 129 阅读 · 0 评论 -
不学无数——Java动态代理
动态代理1. 什么是动态代理在上一章节中,我们讲的是代理其实都是静态代理,动态代理是在运行阶段动态的创建代理并且动态的处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器中。在现在很流行的Spring中有一个AOP(面向切面)的其中核心实现技术就是动态代理的技术。2. 为什么要用动态代理动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,...原创 2018-09-07 15:23:18 · 143 阅读 · 0 评论 -
不学无数——个人搭建的博客已经好了,欢迎访问
新的博客的地址 http://modouxiansheng.top/,在csdn中也会更新文章,有感兴趣的小伙伴可以进去看看。有什么问题可以随时指出来。原创 2018-09-17 20:41:19 · 99 阅读 · 0 评论 -
不学无数——反射和内省的区别
反射和内省的区别 内省是基于反射实现的,主要用来操作JavaBean,通过内省可以很方便的动态获得bean的set/get方法,属性,方法名,他相当于是反射的工具类一样1. 反射反射其实简单来说就是通过类的名字获得对于这个类的描述,这种描述包括方法、构造器、属性的描述。举个例子来说就是通过类名可以进行实例化对象、对类中的方法的调用、对类中属性的赋值。在许多的框架中反射是经常被...原创 2018-09-04 20:25:21 · 232 阅读 · 0 评论 -
不学无数——初识反射
反射:运行时的类信息 运行时类型信息使得你可以在程序运行时发现和使用类型信息1. Class对象 通过Class对象可以在运行时发现一个对象完整的类继承结构类是程序的一部分,每一个类都会有一个Class对象。换句话说既每编写一个新的类,就会产生一个Class对象。而这些Class对象信息是保存在我们用javac 类名.java 进行编译时产生的.class文件中的。...原创 2018-09-04 20:25:02 · 121 阅读 · 0 评论 -
不学无数——Java代理模式
1. 代理 Provide a surrogate or placeholder for another object to control access to it(为其他对象提供一种代理以控制对这个对象的访问)1.1 什么是代理代理是基本的设计模式之一,它是你为了提供额外或者不同的行为,而插入的用来代替”实际对象“的对象。这些操作通常是涉及到与”实际对象“的通信。举个...原创 2018-09-06 14:04:12 · 86 阅读 · 0 评论 -
不学无数——InterruptedException异常
InterruptedException异常在了解InterruptedException异常之前应该了解以下的几个关于线程的一些基础知识。线程的状态线程在一定的条件下会发生状态的改变,下面是线程的一些状态初始(NEW):新建一个线程的对象,还未调用start方法运行(RUNNABLE):java线程中将已经准备就绪(Ready)和正在运行中(Running)的两种状态...原创 2018-09-05 20:57:37 · 215 阅读 · 0 评论 -
不学无数——JAVA中NIO再深入
JAVA中NIO再深入在上一章节的JAVA中的I/O和NIO我们学习了如何使用NIO,接下来再深入了解一下关于NIO的知识。缓冲器内部的细节Buffer由数据和可以高效地访问及操作这些数据的四个索引组成。这四个索引是mark:标记,就像游戏中设置了一个存档一样,可以调用reset()方法进行回归到mark标记的地方。position:位置,其实缓冲器实际上就是一个美化过的数组,从通道中...原创 2018-09-27 17:56:23 · 131 阅读 · 0 评论 -
不学无数——Gson源码解析
Gson在用Gson解析时传过来的Json串时,如果将其解析为对象A,而这个对象A继承了对象B。这两个对象都有属性名为name的值,那么在进行解析的时候就会报如下错误。Exception in thread "main" java.lang.IllegalArgumentException: class Practice.Day12.Student2 declares multiple JSO...原创 2018-10-18 09:55:17 · 187 阅读 · 0 评论 -
工作半年遇到最奇葩的问题
工作半年遇到最奇葩的问题背景公司最近买了一套项目,在启动的时候出现了一系列奇怪的问题,对方的技术栈要求是Tomcat7启动,但是由于我们公司出于安全的考虑所以是要求用Tomcat9进行启动的。问题描述下面情况都是相同war包相同Tomcat情况下系统Tomcat版本能否启动WindowsTomcat7能WindowsTomcat9能macOST...原创 2019-06-20 13:42:53 · 217 阅读 · 0 评论 -
死磕Tomcat系列(1)——整体架构
死磕Tomcat系列(1)——整体架构在许多的高端开发的岗位中都会或多或少有要求面试人员要研究过一些常用中间件源码。这是因为一切的秘密都是藏在源码中,阅读源码能够让我们对框架或者中间件的理解更加深刻,而我们也能够在源码的研究中获得其中一些优秀的设计方式。而我们的中间件和源码那么多,我们该从何入手呢?其实大部分的中间件或者框架都有一些共性的部分,例如网络编程、多线程、反射和类加载等技术。所以深入研...原创 2019-06-20 13:42:27 · 216 阅读 · 0 评论 -
解决Redis集群条件下键空间通知服务器接收不到消息的问题
解决Redis集群条件下键空间通知服务器接收不到消息的问题键空间通知介绍键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。可以通过对redis的redis.conf文件中配置notify-keyspace-events参数可以指定服务器发送哪种类型的通知。下面对于一些参数的描述。默认情况下此功能是关闭的。字符通知K...原创 2019-06-20 13:41:39 · 1308 阅读 · 0 评论 -
一次奇怪的StackOverflowError问题查找之旅
一次奇怪的StackOverflowError问题查找之旅公司最近买了一套老代码,在测试环境部署的时候发生了nested exception is java.lang.StackOverflowError的异常,当时看到这个异常首先想到是栈内存溢出,网上给出的解决办法就是加栈内存大小就行。趁着这个机会也了解一下什么是Java虚拟机栈。Java虚拟机栈我们想要解决StackOverflowEr...原创 2019-06-20 13:41:14 · 213 阅读 · 0 评论 -
徒手撸一个简单的RPC框架(2)——项目改造
徒手撸一个简单的RPC框架(2)——项目改造在上一篇的徒手撸一个简单的RPC框架中再最后的服务器和客户端连接的时候只是简单的写了Socket连接,觉得有些不妥。正好最近学习了Netty,在平时工作中没机会运用,于是自己就给自己出需求将之前的项目改造一下。Netty是什么?在学习Netty之前呢我们首先得了解IO和NIOIO模型IO编程模型简单来说就是上一篇我写的服务端与客户端的连接,...原创 2019-06-20 13:40:23 · 245 阅读 · 0 评论 -
Mysql查询带树状结构的信息
Mysql查询带树状结构的信息在Oracle中有函数应用直接能够查询出树状的树状结构信息,例如有下面树状结构的组织成员架构,那么如果我们想查其中一个节点下的所有节点信息,在Oracle中可以直接用下面的语法可以进行直接查询。START WITH CONNECT BY PRIOR但是在Mysql中是没有这个语法的,而如果你也是想要查询这样的数据结构信息该怎么做呢?我们可以自定义函数。我们...原创 2019-01-22 13:33:06 · 869 阅读 · 0 评论 -
徒手撸一个简单的RPC框架
徒手撸一个简单的RPC框架之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态代理、网络传输、动态加载、反射这些知识点。发现这些知识都了解一些。所以就想着试试自己实现一个简单的RPC框架,即巩固了基础的知识,也能更加深入的了解RPC原理。当然一个完整的RPC框架包含了许多的功能,例如服务...原创 2019-01-22 13:32:18 · 188 阅读 · 0 评论 -
徒手撸一个简单的IOC
徒手撸一个简单的IOCSpring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of Control)是什么呢?控制反转,简单来说就是将控制实体Bean的动作交给了Spring容器进行管理。再简单点来说就是例如之前想用一个类,必须new一个,但是使用了Spring那么直接用@Autowired注解或者用xml配置的方式就能直接获得此对象,而且你也不用管它的生命周期啊等等之...原创 2019-01-25 16:13:12 · 162 阅读 · 0 评论 -
不学无数——组合模式
组合模式在DebugMybatis的源码时,在DynamicSqlSource.getBoundSql动态获取sql的时候,Debug会发现相同的方法但是进去的实现类却不相同,不明白为什么会这样,于是上网查了资料说是运用了组合的设计模式。1. 数据结构 聊组合模式为什么会聊到数据结构呢?看到最后你应该就会明白了相信大家都知道数据结构这门学科,在数据结构中有树这样的概念,树...原创 2018-09-11 20:45:12 · 100 阅读 · 0 评论