
Java
文章平均质量分 68
Java面试总结
鳄鱼儿
计算机专业硕士、优快云博客专家、阿里云博客专家。密码应用技术/云原生/云计算/边缘计算
展开
-
如何实现class文件的反编译:java-decompiler 反编译工具
打开官方文章,我们会发现这个工具已经已经很久没有更新了,到现在,2024年安装一个旧版本工具,不出意外会遇到很多兼容性问题,所以在本篇文章中,主要说明下在2024年使用这个工具可能存在的一些问题。Java Decompiler是一项开源工具,Java Decompiler工具不仅可以实现反编译.class文件,将.class文件变为可以被我们阅读的.java文件,而且还可以对jar包进行反编译,得到jar包中.class文件反编译的.java文件。如果是windows系统,直接下载jar文件。原创 2024-03-08 09:27:51 · 8008 阅读 · 0 评论 -
统一身份认证,构建数字时代的安全壁垒——统一身份认证介绍、原理和实现方法
随着数字化时代的来临,个人和机构在互联网上的活动越来越频繁,对于身份认证的需求也愈发迫切。为了有效应对身份欺诈、数据泄露等问题,统一身份认证(Unified Identity Authentication)应运而生。在本文博主将介绍统一身份认证的概念、原理以及其具体的实现方案。原创 2023-12-27 13:33:49 · 2734 阅读 · 0 评论 -
【面试】Spring Boot构建项目时有哪些常用的注解?
以上这些注解都是Spring Boot开发项目时的一些常用注解,通过合理使用这些注解,我们可以更加便捷地构建和管理Spring Boot项目。通过每个注解下给出的示例代码我们可以从中窥探到一些具体用法,具体如何灵活使用还是得在项目中实践,俗话说:实践出真知,少年行动起来吧,路是自己走出来的,加油。原创 2023-12-27 13:32:39 · 1236 阅读 · 0 评论 -
Spring AOP表达式(execution)规则——排除切点的应用
需要项目原切面的基础上排除一些类中方法。本篇文章主要介绍了切入点表达式,以及如何排除某些类中的方法的方式。原创 2023-02-03 14:53:19 · 4245 阅读 · 0 评论 -
实现异步转同步的几种方式
通过使用回调函数、事件或 Future/Promise 等高级方法,我们可以更加优雅地实现异步转同步,避免了循环等待的缺点。需要注意的是,在使用回调函数、事件或 Future/Promise 等方法时,程序的执行流程会发生变化。因为异步操作是在另一个线程中执行的,所以当异步操作完成后,我们需要通过回调函数、事件或 Future/Promise 等方式通知主线程,然后才能执行后续操作。提醒:在发布作品前请把不用的内容删掉。原创 2022-12-26 10:38:07 · 2312 阅读 · 0 评论 -
Java类加载机制
JVM的类加载机制主要有3种,全盘负责/双亲委派/缓存机制。原创 2022-12-21 15:26:37 · 280 阅读 · 0 评论 -
Java反射介绍
反射是一种高级功能,使用起来相对复杂,需要谨慎操作。反射的效率较低,不应该在高性能要求的代码中使用。反射可能破坏封装性,因为它可以访问并修改私有字段和方法。反射的安全性较低,可能会抛出各种异常,需要进行异常处理。反射可能不稳定,因为它依赖于类的内部结构,如果类的内部结构发生改变,反射代码可能会失效。尽管如此,反射在Java中仍然是一个非常有用的功能。它可以用于实现动态代理、框架和工具等。但是,在选择使用反射时,应该慎重考虑它是否符合程序的需要,并适当地进行异常处理和性能优化。原创 2022-12-21 15:26:13 · 1851 阅读 · 1 评论 -
使用@Component时再使用@Resource或@Autowired时注入失败问题
在@Component注解的类下,再使用了@Resource或@Autowired注解。如此操作会导致依赖注入失败。这是因为spring加载它们的顺序不同,在使用@Component注解将bean实例化到spring容器内的时候,因为@Autowired是在这个bean之中的,此时@Autowired还未完成自动装载,所以导致依赖注入的service为null。原创 2022-12-21 15:25:26 · 8946 阅读 · 1 评论 -
mybatis中关于动态sql的实现
MyBatis是一个支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。它支持定制化 SQL、存储过程以及高级映射。通过使用 MyBatis,可以很容易地将数据库操作与业务逻辑分离,从而提高开发效率和系统可维护性。MyBatis 提供了一种称为动态 SQL 的机制,可以方便地根据需要构建和执行动态 SQL 语句。这种机制使得开发人员可以在不确定查询条件的情况下构建查询,并且可以动态地根据实际情况调整 SQL 语句的结构,从而提高查询的灵活性。在 MyBatis 中,可以通过使用 、、 等标签来实现动原创 2022-12-07 16:25:00 · 1248 阅读 · 0 评论 -
Java 中 CompletableFuture 异步转同步的方式
使用 CompletableFuture.get() 方法:CompletableFuture 是 Java 8 中引入的一种异步编程工具,它可以让你在不阻塞当前线程的情况下执行异步操作。当你需要等待异步操作的结果时,可以使用 CompletableFuture.get() 方法来获取结果,但这会阻塞当前线程,直到结果可用为止。使用 CompletableFuture.join() 方法:与 CompletableFuture.get() 方法类似,CompletableFuture.join() 方法也可原创 2022-12-06 20:34:54 · 2856 阅读 · 0 评论 -
Netty系列(五):源码解读ServerBootstrapAcceptor类职能,探究Netty启动流程
是Netty服务端用来接收客户端连接的核心类,本文将介绍的职能。在上一篇文章源码解读 backlog 参数作用中我们知道,在Netty服务端启动时,会调用绑定本地端口用来监听客户端的连接。而这个方法会通过反射创建并初始化,会初始化,将添加到服务端的中。方法用于服务端Channel的初始化,初始化的,并向中添加了一个。是一个,但它不处理任何出站、入站事件,其目的只为了完成的初始化。当被添加到后,会触发一个方法回调,这个方法里会调用进行初始化,初始化完成后会将自己从中删除,我们再看回类,其中在向中添加时,在方法原创 2022-12-04 11:55:01 · 581 阅读 · 0 评论 -
Netty系列(四):源码解读 backlog 参数作用
在接口中,有一个方法,这个方法的作用是将通道的套接字绑定到本地地址并配置套接字以侦听连接。即用于在套接字和本地地址之间建立关联。而一旦建立关联,套接字将保持绑定状态,直到通道关闭。我们注意到方法中有一个参数,它表示套接字上挂起连接的最大数量。参数表示绑定套接字的地址,如果其值为null,则绑定到自动分配的套接字地址。参数含义参数为套接字监听端口时,内核为该套接字分配的一个队列大小,在服务端还没有来得及处理请求时, 用来暂时缓存请求的一个队列。如果该队列已经被客户端socket占满了,新的连接再过来时,原创 2022-12-04 11:51:49 · 1049 阅读 · 0 评论 -
Netty系列(三):Netty服务端发送消息到客户端
通常客户端只会主动发送心跳消息,目的是为了保持与服务端连接,而其他消息往往需要服务端发送消息至客户端调取。原创 2022-12-02 21:50:27 · 8398 阅读 · 6 评论 -
Java8新特性:stream流应用,丢掉for循环实现复杂遍历功能
到此,基础Stream用户就已经说完了,看到这里我们会发现,所以的stream其实都可以用for循环来实现,而我们全篇都没有使用for循环来实现,这些如果用for循环实现,你会发现实现的语句变得复杂了很多,不信的话,你可以试试。我们也可以看到stream带来的好处,包括代码更简洁、解耦等。原创 2022-12-02 21:48:44 · 2878 阅读 · 0 评论 -
Mybatis中where标签和if标签结合使用说明
当标签判断失败后,标签关键字可以自动去除掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即标签只会去掉标签语句中的最开始的and关键字。所以上面的写法(and写在后面)是不符合mybatis规范的。原创 2022-11-29 09:49:49 · 4244 阅读 · 0 评论 -
mybatis 实现插入或更新数据功能,数据存在时只更新
提供一个接口,既能保证新数据的插入操作,又能在数据存在时进行数据更新操作。原创 2022-11-29 08:50:56 · 3116 阅读 · 0 评论 -
Spring Boot 中启用异步调用
在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行。在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可以返回。在某些场景中,异步调用可以提升用户响应的体验感。那么如何在Springboot中开启异步调用呢?原创 2022-11-27 15:56:12 · 656 阅读 · 0 评论 -
Netty系列(二):Netty拆包/沾包问题的解决方案
造成TCP协议粘包/拆包问题的原因是TCP协议数据传输是基于字节流的,它不包含消息、数据包等概念,是无界的,需要应用层协议自己设计消息的边界,即消息帧(Message Framing)。如果应用层协议没有使用基于长度或者基于分隔符(终结符)划分边界等方式进行处理,则会导致多个消息的粘包和拆包。原创 2022-11-24 08:42:56 · 1372 阅读 · 0 评论 -
Netty系列(一):Springboot整合Netty,自定义协议实现
Netty是由JBOSS提供的一个java开源框架,现为上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程。原创 2022-11-22 23:29:34 · 2425 阅读 · 1 评论 -
ssm项目扩展多数据源mysql
一个ssm项目中需要扩展多个数据源,原来只有一个mysql,现在需要再扩展一个mysql,现将需要改动的地方做一个记录。原创 2022-09-26 09:22:11 · 596 阅读 · 0 评论 -
从Java源码上分析为什么LinkedList随机访问比顺序访问要慢这么多?
随机访问使用get方法,从源码中我们可以得知,每次都遍历找到该元素位置再返回,当我们需要遍历一次,其实会遍历很多次,做了重复性工作。源码从迭代器源码中我们得知,在进行顺序访问时,只在第一次,index=0时进行了一个折半判断,此后按照顺序依次向后传递获取元素,实际只进行了一次遍历过程。由此可见,的顺序遍历比随机遍历快很多。...原创 2022-07-05 18:07:03 · 595 阅读 · 0 评论 -
JAVA面试总结 查漏补缺
Java面试总结原创 2022-06-11 21:35:07 · 308 阅读 · 0 评论 -
JAVA同步锁 synchronized(this)、synchronized(class)与synchronized(Object)的区别
当一个线程访问Synchronized类的一个synchronized (this)同步代码块时,其它线程对同一个Synchronized类中其它的synchronized ()同步方法的访问将是堵塞;访问synchronized (Synchronized.class)同步代码块时, static synchronized同步方法的访问将是阻塞,这说明synchronized (this)和synchronized ()同步方法、synchronized ...原创 2022-06-07 23:25:59 · 1334 阅读 · 1 评论 -
新生代为什么要有两个survivor区域
首先讲一下复制算法复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。(此时注意是先复制存活对象,然后在回收调 si 的对象,后面有用)然后讲一下如果没有 survior 区会怎么样?如果没有 Survivor,Eden 区每进行一次 Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发 Full GC。老年代的内存空间远大于新生代,进行一次Full GC 消耗的时间比原创 2022-05-04 11:21:21 · 175 阅读 · 0 评论 -
使用^、&(异或、并且)位运算 实现算数加法(+)
🍀位运算用位运算即是计算机的运算规则,而计算机只懂得二进制,所以位运算使用的进制是二进制,本文所述皆为二进制,下文中不在赘述。位运算与计算机的CPU相关,32位的CPU只能表示32位内的数。🍀加法计算这里先用个位数的加法(只考虑个位数,不考虑进位)来进行。1 + 1 = 01 + 0 = 10 + 1 = 10 + 0 = 0可以看出,这些表达式可以用异或“^”来表示。1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0个位数的加法计算完成,但不要忘记还原创 2022-03-12 17:14:18 · 1044 阅读 · 0 评论 -
Java源码混淆,jar包加密,禁止反编译jar包
🍀对jar包加密使用 XJar 对jar包进行加密。GitHub: https://github.com/core-lib/xjarSpring Boot JAR 安全加密运行工具, 同时支持的原生JAR基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案, 避免源码泄露以及反编译功能特性无代码侵入, 只需要把编译好的JAR包通过工具加密即可.完全内存解密, 降低源码以及字节码泄露或反编译的风险.支持所有JDK内置加解密算法.可选择需要加原创 2022-03-11 21:59:26 · 9831 阅读 · 4 评论 -
Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
🍀Optional 类JDK1.8开始引入的特性,Optional 类主要解决空指针异常(NullPointerException)问题。Optional类是一个可能包含或不包含非空值(可以为null)的容器对象。 如果一个值存在,调用 isPresent()方法将返回true、get()方法将返回该对象。Optional类提供判断空值的方法,使用其中方法可以不用再显式地进行空值检测。举例:User类的结构String isocode = user.getAddress().getCountr原创 2022-03-09 22:03:14 · 654 阅读 · 0 评论 -
排序算法理解总结篇——冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、计数排序、基数排序、桶排序
🍀排序算法-平均时间复杂度排序算法平均时间复杂度冒泡排序O(n2)O(n^2)O(n2)选择排序O(n2)O(n^2)O(n2)插入排序O(n2)O(n^2)O(n2)希尔排序O(n1.5)O(n^{1.5})O(n1.5)归并排序O(n∗logN)O(n*logN)O(n∗logN)堆排序O(n∗logN)O(n*logN)O(n∗logN)快速排序O(n∗logN)O(n*logN)O(n∗logN)基数排序O(d(n+r)原创 2022-03-04 22:19:34 · 471 阅读 · 1 评论 -
Java 多线程总结
????Process 和 Thread程序是指令和数据的有序集合,而进程是执行程序的一次执行过程,是系统资源分配的单位。一般在一个进程中可以包括若干个线程,一个进程中至少有一个线程。线程是CPU调度和执行的单位。????线程的创建三种创建线程方式1.Thread class,继承Thread类2.Runnable接口,实现Runnable接口3.Callable接口,实现Callable接口...原创 2022-01-04 17:35:38 · 542 阅读 · 0 评论 -
JDK1.8 中文文档下载与在线阅读
????jdk api 1.8_google.CHM下载云盘下载:https://tooyi.lanzouo.com/ikZ28xbcjfa 密码:26wm在线下载地址:https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html????在线阅读https://docs.oracle.com/javase/8/docs/api/?xd_co_f=47c934d9-e663-4eba-819c-b726fc2d08原创 2021-12-06 17:03:04 · 8345 阅读 · 4 评论 -
CAS自旋锁到底是什么?为什么能实现线程安全?
????介绍CAS(Compare and swap),即比较并交换。我们平时所说的自旋锁或乐观锁,其中的核心操作实现就是CAS。????保证原子操作任何技术的出现都是为了解决某些特定的问题, CAS 要解决的问题就是保证原子操作。原子操作是什么,原子就是最小不可拆分的,原子操作就是最小不可拆分的操作,也就是说操作一旦开始,就不能被打断,直到操作完成。在多线程环境下,原子操作是保证线程安全的重要手段。举个例子来说,假设有两个线程在工作,都想对某个值做修改,就拿自增操作来说吧,要对一个整数 i 进行自增原创 2021-11-25 23:47:39 · 2457 阅读 · 0 评论 -
JDK1.8 中 ConcurrentHashMap源码分析(二)元素添加是线程安全的
上一篇说到了ConcurrentHashMap初始化原创 2021-11-24 21:59:12 · 774 阅读 · 0 评论 -
JDK1.8 中 ConcurrentHashMap源码分析(一)容器初始化
上一篇文章中说到如何使用IDEA搭建JDK1.8阅读学习环境,JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码。这篇文章将学习ConcurrentHashMap源码????ConcurrentHashMap初始化在jdk8的ConcurrentHashMap中一共有5个构造方法,这5个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做了处理。jdk8的ConcurrentHashMap的数组初始化是在第一次添加元素时完成 // 没有维护任何变量的操作,如果调用该方法,数组原创 2021-11-19 20:24:00 · 1229 阅读 · 0 评论 -
JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
????jdk下载本文使用JDK版本为jdk1.8下载地址:https://www.oracle.com/java/technologies/downloads/archive/????获取源码下载jdk压缩包版就可以,解压后,文件路径中会有一个src.zip文件,这个就是jdk源码。解压后就可以获得jdk源码啦。建议拷贝后换个路径再解压。如下是我存放的路径????导入IDEA☘️新建java项目使用默认配置,选择下一步勾选从模板创建项目,再选择下一步选择jdk源码路径,完成原创 2021-11-19 17:26:48 · 4966 阅读 · 1 评论 -
Windows环境下多个tomcat启动,CATALINA_HOME配置(大坑)
????前言上篇文章提到Windows环境下多个tomcat启动方法在服务器配置了多个tomcat,同时配置了CATALINA_HOME,这个就给后面的tomcat启动挖坑了 。????tomcat启动流程查看bin/startup.bat文件@echo offrem Licensed to the Apache Software Foundation (ASF) under one or morerem contributor license agreements. See the NOT原创 2021-11-19 14:34:08 · 6010 阅读 · 0 评论 -
Windows/Linux服务器上Tomcat开启远程调试,使用IDEA本地调试
注意:要保证本地的代码与服务器上部署的代码完全一致????本文环境tomcat:8.5IDEA:2021.1????开启tomcat远程调试☘️Windows环境修改bin/catalina.bat文件set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005☘️Linux环境修改bin/cat原创 2021-11-15 10:46:46 · 1628 阅读 · 1 评论 -
Spring源码学习--new()和反射的实例化区别
new()new对象是静态编译,是需要知道类名才能使用的。反射反射是动态编译,在一些时候不需要知道类名就可以使用。可以访问类的静态方法。反射实例对象的四种方法// 1.类.classClass clazz = 类.class;// 2.对象.getClass()Class clazz = 对象.getClass();// 3.Class.forName("com.ber")Class clazz = Class.forName("完全限定名");// 4.类加载器ClassLoad原创 2021-11-09 20:45:49 · 280 阅读 · 0 评论 -
Spring Framework源码编译,开始Spring源码学习
????Spring Framework源码编译博主本地java版本为 java version "11.0.10"????拉取源码选定存放路径直接只用git clone拉取最新源码git clone https://github.com/spring-projects/spring-framework.git目前最新RELEASE版本是5.2.18,编译前需要将tag切换至这个版本。git checkout a1225f0????修改仓库镜像地址,加快依赖下载速度vim buil原创 2021-11-09 13:49:56 · 674 阅读 · 0 评论 -
Windows环境下多个tomcat启动方法
使用解压版tomcat安装版会使用统一的服务名,这个不好修改。为了方便最好使用解压版端口修改tomcat在启动时会占用几个端口,如果存在端口冲突肯定是启动不了的。http访问端口修改文件路径:conf下的server.xml文件默认端口为8080,可以修改为其他端口,如8081shutdown端口修改文件路径:conf下的server.xml文件默认端口为8005,可以修改为其他端口,如8006jvm启动默认端口修改默认8009,解开注释可进行修改...原创 2021-11-02 16:52:45 · 480 阅读 · 0 评论 -
在CentOS7上安装RocketMQ 4.8.0
安装过程服务器上已经安装了OpenJDK 8,并设置了JAVA_HOME 。下载和解压RocketMQ在RocketMQ官网上找到下载RocketMQ4.8.0的链接,下载和解压RocketMQ:下载wget http://ftp.cuhk.edu.hk/pub/packages/apache.org/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip解压unzip rocketmq-all-4.8.0-bin-release.zip安装到/u原创 2021-10-24 11:07:08 · 505 阅读 · 1 评论