Java
文章平均质量分 62
FserSuN
这个作者很懒,什么都没留下…
展开
-
Java 线程上下文传递
在Java并发编程中,线程上下文(Thread Context)是指与执行线程相关的环境和状态信息。这包括线程的局部变量、事务上下文、安全凭证、用户会话信息等。在多线程应用程序中,每个线程可能需要处理不同的任务,这些任务可能需要访问和修改与当前线程相关的特定数据。通常有下列常见的使用场景。数据隔离:在并发编程中,数据隔离是保证线程安全的关键。使用线程上下文可以确保每个线程都有自己的数据副本,从而避免了数据共享时的并发问题。原创 2024-07-21 16:17:16 · 733 阅读 · 0 评论 -
Java中职责链的泛化使用
ChannelInboundHandlerAdapter 与 ChannelOutboundHandlerAdapterif (packet instanceof LoginRequestPacket) {// …} else if (packet instanceof MessageRequestPacket) {// …} else if …public class LoginRequestHandler extends SimpleChannelInboundHandler {@Over翻译 2022-04-30 23:14:25 · 227 阅读 · 0 评论 -
Java 线程池拒绝策略
0 前置依赖本例中会依赖assertj-core完成单测,maven依赖如下: <!-- https://mvnrepository.com/artifact/org.assertj/assertj-core --> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> &l翻译 2021-10-30 20:13:32 · 1087 阅读 · 0 评论 -
Java中两种json diff的实现学习
Java中两种json diff的实现学习json diff就是找两个json的差异,找差异时维度可以是第一层字段维度。或者是深度差异比较。为了演示这个功能,需要依赖两个工具包。 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <versio翻译 2021-07-04 15:55:12 · 6698 阅读 · 2 评论 -
Java package-info.java文件使用学习
1. 概述本教程中,我们将学习package-info.java文件的用途。简而言之,package-info.java是一个Java文件,这个文件可以被添加到任何的package中。2. package-info文件的用途package-info文件的两大用途如下:用作包级的说明文档定义包级注解除了这两点,也可以按需扩展使用。如果需要添加任何包级的特性,则可以将这些信息添加到该文件中。3.包级的文档jdk1.5之后引入了这个文件,用于增加包级的定义,下面是一个例子。/** * Th翻译 2021-06-12 15:25:16 · 920 阅读 · 0 评论 -
idea debug模式调试无法进入单元测试或程序的解决办法
idea debug模式调试无法进入单元测试或程序或调试速度很慢的解决办法在Java项目中,当我们设置断点过多,有时候会出现无法正常启动系统或单元测试。例如Spring/SpringBoot项目,一直处在启动中,但使用无法正常相应。或者是执行junit单元测试,一直无法进入在test中设置的断点。这时可以尝试如下操作:IDEA调试性能受到下列因素的影响:由于JVM的设计原因,相关计算开销较大,方法断点会降低调试性能。可以考虑删除方法断点,使用行断点[1]。可以在项目的workspace.xml文件翻译 2020-12-03 02:07:21 · 4995 阅读 · 0 评论 -
Java Instrumentation API开发Java Agent学习记录
1.简介本文将讨论Java Instrumentation API。Instrumentation API由JVM提供用来修改已加载类的工具,可以提供Java语言编写的插桩功能,动态修改运行时代码的能力。此外本文还会介绍如何开发Java agent,通过Java agent来动态增强系统功能。2.JPDA介绍JPDA(Java platform debugger architecture)定义了一整套完整的调试体系,它将调试体系分为三部分,并规定了三者之间的通信接口[1]。三部分由低到高分别是Jav翻译 2020-11-08 22:34:24 · 1601 阅读 · 0 评论 -
并发调用隔离之BulkHead模式学习
1 BulkHead模式是什么bulkhead指船的防水壁,如下图:当一个防水壁漏水时不会导致整个船沉掉,起到保护作用,提高稳定性。即通过隔离的形式,让不稳定因素限制在某一个小范围内,不会导致整个系统崩溃。在我们日常开发系统,对外提供服务均以HTTP或RPC的形式对外提供。如下图,每种形式在接收到请求后根据业务的不同会在内部调用多个外部依赖来完成业务。一个接口会依赖多个外部远程服务。外部服务由于各种原因,可能不可靠。会出现超时,无响应的情况。这样就会导致调用线程阻塞。如果有大量的这种请求产生,则会原创 2020-09-26 21:29:53 · 1150 阅读 · 0 评论 -
Java深拷贝的几种方法
1. 简介在Java中拷贝对象有深拷贝和浅拷贝两种。本文将对这两种方法进行比较,并学习四种实现深拷贝的方法。2. Maven依赖后文实现深拷贝会依赖两个工具 Gson、Jackson 及 apache commons lang。为了进行单元测试我们这里使用assertj流式断言库。<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artif翻译 2020-08-25 13:27:44 · 24328 阅读 · 2 评论 -
Java使用Bean Validation验证枚举类型
1.简介第一篇介绍了Bean Validation基本使用。本文主要介绍通过自定义Validation注解来验证枚举。系统提供的默认注解大多数注解无法用来验证枚举。例如,使用@Pattern注解验证enum将会得到错误提示。javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Pattern' valid翻译 2020-07-10 22:32:23 · 6537 阅读 · 0 评论 -
使用Bean Validation 2.0验证Java Bean
1 简介本文将介绍通过标准框架对Java bean的成员进行验证 - JSR 380。验证用户输入是一个常见的需求。Java Bean验证框架是一个用来处理这类验证逻辑的一套标准。通过使用注解简化我们的验证规则开发。2 JSR 380JSR 380[1]是Java API中用来验证Bean所定义的规范。通过@NotNull,@Min 及 @Max等注解实现验证。3.依赖本节介绍使用该框架所需的maven依赖。我们需要添加下述依赖完成验证工作。3.1 Validation API<dep翻译 2020-05-30 21:37:51 · 499 阅读 · 0 评论 -
google GSON打印json所有叶子节点的路径
1.背景当我们有一串json字符串,有时候希望能得到json path。例如JSON.l1.l1_2.l1_2_1 表示节点121的路径。通过GSON提供的功能我们可以快速获取路径。{ "l1": { "l1_1": [ "l1_1_1", "l1_1_2" ], "l1_2": { ...原创 2019-12-04 21:57:36 · 1108 阅读 · 0 评论 -
Java 8+ 函数式库Vavr功能简介
1 概述Vavr 是Java 8+中一个函数式库,提供了一些不可变数据类型及函数式控制结构。1.1 Maven 依赖添加依赖,可以到maven仓库中查看最新版本。<dependency> <groupId>io.vavr</groupId> <artifactId>vavr</artifactId>...翻译 2018-04-26 00:48:12 · 11650 阅读 · 0 评论 -
使用URLClassLoader加载不同Jar包中的相同包名相同类名的类
使用URLClassLoader加载不同Jar包中的相同包名相同类名的类开发中会遇到这种情况,使用一项功能需要依赖jar,然而一段时间后这些包升级,包名和类名均不变的情况下功能发生变化。旧的jar依然需要使用,而新功能却需要使用新升级的jar。这时如果依赖两个包,使用时会造成冲突。因此需要进行jar隔离。有很多的隔离框架可以使用,如jarlinks。本文将演示通过URLClassLoader加...原创 2018-07-07 00:45:12 · 6226 阅读 · 0 评论 -
Java 8 CompletableFuture的使用入门
1 前言Java 5中引入了Future接口,来表示异步计算的结果,但接口并没有任何其它方法来组合计算任务或处理错误。Java 8 中引入了CompletableFuture类。该类实现了Future和CompletionStage接口。CompletionStage定义了异步计算的步骤,每个步骤可以进行组合。CompletableFuture提供了50多个不同的方法,用来创建、组合、...翻译 2018-07-28 16:36:33 · 1278 阅读 · 0 评论 -
Slf4j获取日志对象(Logger)的实现分析
1 Slf4j简介日常开发中记录日志有很多框架,如:java.util.logging、Apache log4j、logback等。如果使用某种具体框架,一段时间后需要切换框架那么会很麻烦,因此有了Slf4j(Simple logging Facade for Java)。Slf4j提供了统一的日志接口,你可以根据需求配置不同的实现。这样可以并保持接口稳定,并轻易变更具体日志框架。2 实现分析...原创 2018-12-22 15:37:39 · 13178 阅读 · 1 评论 -
Maven工程下Java加载so包no suitable image found unknown file type排查与处理
问题产生背景使用IDE为idea intellij,在SpringBoot项目中需要用到native方法,因此需要依赖so包(Shared Object Library)。考虑把so包放在项目的resource目录下。通过System.loadLibrary方法加载包有配置路径的方法。启动系统通过-D参数指定绝对位置。系统运行时内部代码通过相对位置定位。2在运行时通过相对位置加载提高灵...原创 2019-01-08 01:49:29 · 7866 阅读 · 7 评论 -
Java在jar包中加载so包dll包dylib等
背景使用IDE为idea,/lib/libxyz.so位于resource下,通过动态设置jar路径,然后加载。System.loadLibrary(&amp;amp;quot;xyz&amp;amp;quot;);如果直接启动idea系统正常加载。但将项打包为jar,启动jar包运行确出现找不到jar加载异常,产生unsatisfied linked error异常。分析通过idea启动项目,XXX.class.getResource...原创 2019-01-20 16:02:56 · 9614 阅读 · 1 评论 -
jdk 1.8 Fork/Join 框架基本使用
1概述fork/join框架在Java 7 中引入。该框架通过分治思想,并利用所有可用的处理器来加快并行任务的处理速度。fork阶段,不断递归的将任务分解为较小的子任务,知道这些子任务足够小并被执行。join阶段,在任务分解处理完毕后,将各个子任务结果合并。如果任务返回void,就等待子任务完成。fork/join框架使用ForkJoinPool线程池提高并行执行的效率,该线程管理Fork...翻译 2019-03-02 16:07:05 · 1406 阅读 · 0 评论 -
使用Java枚举实现简单的状态机
1.概述本文将介绍在Java中如何通过枚举来实现状态机。通过与接口及具体类来的实现方式来说明枚举实现状态机器的优势。2.Java Enums枚举是一种定义了一组常量的特殊的类。通过枚举使代码可读性更好。我们以人力资源系统为例,该系统可以批准雇员离职申请。这个申请需要小组领导审批,随后将审批结果提交给部门领导。部门领导最终有权利批准申请。首先定义离职请求涉及的状态。public enum ...翻译 2019-03-29 22:25:11 · 2897 阅读 · 1 评论 -
Guava布隆过滤器(boomfilter)使用简介
1 布隆过滤器简介布隆过滤器是一种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中。但是存在一定可能,导致结果误判。即元素不在集合中,查询结果却返回元素在集合中。布隆过滤器一些的性质与哈希表不同,布隆过滤器是一个大小固定的过滤器,可以通过任意大的数字来描述集合大小添加一个元素到集合中永远不会添加失败,但误报率会随着添加元素数量的增多逐渐上升,直到集合中所有位都设置位1查询一...翻译 2019-07-07 16:00:49 · 10506 阅读 · 0 评论 -
Java在Map中存放重复key
1.概述本文介绍几种处理Map中一个key对多个value的方法。在JDK标准Map实现中当我们尝试在一个key下插入多个value,那么后续的value会覆盖前面的value。Map<String, String> map = new HashMap<>();assertThat(map.put("key1", "value1")).isEqualTo(null);...翻译 2019-07-17 02:06:42 · 30665 阅读 · 1 评论 -
在Java中自定义注解
1.定义注解JDK5开始引入注解,Java注解是一种在源码中添加元信息的机制。本文将创建一个自定义注解用来将对象转换为JSON字符串。通过@interface关键字定义注解。public @interface JsonSerializable {}接着通过Retention和Target定义元信息。 这个注解仅在运行时可见,并作用在类上。通过定义这个注解标记一个类,表示类可以被序列化为...翻译 2019-07-23 00:46:20 · 449 阅读 · 0 评论 -
Java CopyOnWriteArrayList Copy on Write(写时复制)
Java Copy on Write(写时复制)分析Copy on Write这种机制用在集合上,当读取元素,先复制原有集合内容,在集合的某个副本上进行遍历操作。当发生写操作时,首先复制原有集合内容生成一个副本,随后在这个副本上进行写操作。 CopyOnWriteArrayList<Integer> ids = new CopyOnWriteArrayList<...原创 2019-10-01 12:31:23 · 687 阅读 · 0 评论 -
Java中的静态类以及嵌套类
原文地址: http://www.geeksforgeeks.org/static-class-in-java/在Java中类可以是静态的么?在Java中类可以是静态的。在Java中有静态实例变量,静态方法,以及静态块,类也可以是静态的。在Java中我们可以在类中再次定义一个类。这种类被称为嵌套类。嵌套类外围的类被称为外部类。在Java中不能使最顶层类为静态类,而只有嵌套的类可翻译 2016-05-03 00:04:52 · 5418 阅读 · 0 评论 -
用Java实现事件驱动框架(二)
本文将基于上一篇用Java实现事先驱动框架(一)来模拟实现一个简单的聊天室系统结构设计首先确定简单聊天系统的基本对象。系统需要两种基本数据结构:用户与聊天室。用户类用户的定义如下。每一个进行聊天的用户都有一个名字。private static class User { public String name; public User(String name) ...翻译 2018-05-01 20:26:24 · 1362 阅读 · 0 评论 -
用Java实现事件驱动框架(一)
上一篇文章中,我们介绍了事件驱动的基础组件。本文,我们将开发一个事件驱动的框架。消息系统事件驱动框架参照一些消息系统中的模式。我们将进行如下类比。 事件与消息,事件处理器与通道,事件转发器与路由。一个实例是邮递系统。邮递员有一个背包里面有若干信件,上面有要寄送的地址,邮递员必须将信件寄送到相应的地址。这个过程可以按如下形式描述?procedure deliver_lette...翻译 2018-04-30 21:41:57 · 5413 阅读 · 0 评论 -
java.io.EOFException: Unexpected end of ZLIB input stream异常处理
java.io.EOFException: Unexpected end of ZLIB input stream异常处理因需要完成压缩于解压缩功能,所以使用到java.util.zip中的类。同时使用了jdk 1.7 try with resource 的特性,结果暴出 java.io.EOFException: Unexpected end of ZLIB input stream异常。jav原创 2016-07-30 16:44:44 · 31318 阅读 · 1 评论 -
IllegalAccessException: Class A can not access a member of class B 的一种原因分析与解决
Caused by: java.lang.IllegalAccessException: Class A can not access a member of class B 的一种原因分析与解决我在使用到一个java fluent api工具时遇到这个问题,出现异常后调用栈。Caused by: java.lang.IllegalAccessException: Class com.fluenti原创 2016-12-24 12:30:28 · 8676 阅读 · 0 评论 -
Dubbo消费端java.lang.NoClassDefFoundError错误的排查
当时在代码中调用Dubbo服务时产生这个异常。javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class com.fengdai.report.api.ReportApiProvid原创 2016-10-31 19:18:14 · 16259 阅读 · 1 评论 -
Java中如何处理空指针异常
英文原文地址:http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-nullpointerexception-how-to-handle-null-pointer-exception/?utm_source=tuicool 在Java语言在,null被分配给一个对象的引用以表示对象指向未知数据块。当应用程序使翻译 2015-06-21 13:48:05 · 20312 阅读 · 0 评论 -
Java中ResourceBundle类的使用
原文地址:http://tutorials.jenkov.com/java-internationalization/resourcebundle.htmljava.util.ResourceBundle类用来存储文本以及本地化敏感的组件。本文将介绍ResourceBundle及它的子类。ResourceBundle的类层次结构ResourceBundle类有两个子翻译 2016-05-06 14:15:04 · 6633 阅读 · 0 评论 -
Java使用Apache poi 导入Excel文件
在Java使用Apache poi 操作Excel-基本概念与使用中介绍了poi与excel相关的基本概念,接下来通过poi来导入excel。本文将使用如下版本的 POI来完成导入数据的演示。 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactI原创 2017-02-05 20:06:14 · 5744 阅读 · 2 评论 -
Java中通过为null的引用调用静态方法
下面的代码,通过为null的引用调用静态方法,且并未产生异常。public class Why { public static void test() { System.out.println("Passed"); } public static void main(String[] args) { Why NULL = null; NULL.test(); }}翻译 2017-02-27 23:25:06 · 3937 阅读 · 1 评论 -
基于JDK动态代理实现的接口链式调用(Fluent Interface)工具
什么是链式接口(Fluent Interface)根据wikipedia上的定义,Fluent interface是一种通过链式调用方法来完成方法的调用,其操作分为终结与中间操作两种。[1]下面是一个Wikipedia上的例子。Author author = AUTHOR.as("author");create.selectFrom(author) .where(exists(sele原创 2016-12-28 01:06:30 · 2585 阅读 · 2 评论 -
事件驱动模型基本结构
事件驱动模型基本结构事件驱驱动架构由三个基本组件构成,事件、事件处理器、事件循环。事件产生后发送给事件循环,事件循环将每个事件分派给个各个事件处理器。事件A由处理器A处理,事件B将被处理器B处理。事件事件驱动架构的核心是事件。事件至少包含两个必须的属性:类型和数据。事件的类型确定了由哪个事件处理器来处理事件及事件相关的数据。因此我们可以将事件对象看作是数据的容器。Java中一个简单...翻译 2018-04-30 20:26:30 · 3717 阅读 · 0 评论 -
Java 8 lambda表达式中的异常处理
1. 概述在Java 8 中,当写lambda表达式并处理异常时代码变得冗余不堪,本文主要介绍lambda表达式中一些异常处理方式。2. 处理 Unchecked 异常下面的代码,当i为0时会引发ArithmeticException异常。List<Integer> integers = Arrays.asList(3, 9, 7, 6, 10, 20);in...翻译 2018-04-12 01:47:58 · 35295 阅读 · 0 评论 -
socket连接代理socketRead0(Native Method) 线程阻塞处理
socket连接代理导致线程阻塞处理系统中使用了socket连接代理系统,但运行了一阵后发现线程池中的线程一直在稳定增长。其间出现过一次RejectedExecutionExceptio。导出线程栈如下,随后将服务禁用,再次导出依然大量线程处于下列状态。说明有很多线程阻塞在socketRead0上。3822 java.lang.Thread.State: RUNNABLE3823 at java.原创 2017-11-12 12:42:46 · 8189 阅读 · 0 评论 -
Java 进程的退出机制与Shutdown hook
基本概念进程与线程:一个进程包含多个线程,一个进程中所有线程都退出后,该进程才会退出。用户线程与守护线程:任一用户线程未退出,JVM进程不退出,当所有用户线程都退出时, 守护线程线程自动退出。Shutdown hook:进程退出时执行的钩子,主要用来清理释放资源使进程友好的退出。Shutdown hook例子: public class TestShutdownHook { pub翻译 2017-08-22 01:14:46 · 5955 阅读 · 0 评论 -
Java网络编程HTTP代理的使用
Java网络编程HTTP代理的使用HTTP协议中常用的方法有GET、POST等。若需要使用HTTP代理就要用到HTTP协议的CONNECT方法。通过CONNECT方法将服务器作为跳板,让服务器代替用户去访问其它网页,最后将访问结果返回给用户。使用CONNECT方法需要使用TCP直接去连接。public class Main { public static void main(String[] a翻译 2017-09-13 01:08:19 · 961 阅读 · 0 评论