Java
文章平均质量分 62
任庆
坚持做正确的事
展开
-
Java 函数式编程合集
Java的这个函数式编程,总感觉还是很拗,说是传递的函数,实际上是传递函数所属的对象,然后调用接口,并不是纯的传递函数,只不过是借助lambda简化了一下写法,或者是终于官方提供了一个“传函数”的规范吧。原创 2022-08-21 14:25:04 · 3349 阅读 · 0 评论 -
使用SPI解耦服务调用
在开发java组件时,一个功能组件往往需要支持多种规范,在客户端调用时需要根据不同情况,进行不同的服务调用。不需要外挂配置文件,通过修改jar包的META-INF/services/全路径类型的文件(内容为需要使用的服务的全路径类名)的方式来实现。使用场景:客户端添加一些service选择逻辑,配合jar包的配置文件,灵活调用组件的实现。方案一:使用配置文件,通过外部挂载一个配置文件,客户端读取配置文件,根据配置类型调用组件的服务。客户端使用组件时,需要根据自身情况调用不同协议版本的服务。...原创 2022-08-08 10:42:19 · 358 阅读 · 0 评论 -
CompletableFuture 使用详解
以下所有的方法都类同。thenCombine会把两个CompletionStage的任务都执行完成后,把两个任务的结果一块交给thenCombine来处理。两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的转化操作。两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的消耗操作。从示例代码中可以看出,该方法只是消费执行完成的任务,并可以根据上面的任务返回的结果进行处理。...转载 2022-07-24 10:10:08 · 4489 阅读 · 0 评论 -
JDK原生发布订阅 Observer Observable
Observable对象里维护了一个Observer的Vector列表,在this.addObserver()时,会把Observer添加到列表中,值得注意的是添加时会判断是否已存在,判断的依据是Object.equals。使用场景是以单个订阅为主(一个topic对应多个consumer),如果有多个topic则需要创建多个Observable实例,相当于每个topic就是一个WeChat对象。如果想让一个WeChat对象能支持多个topic订阅(实际上是多个tag),则需要二次封装。...原创 2022-07-24 10:06:54 · 282 阅读 · 0 评论 -
tomcat启动报错:Error configuring application listener of class org.springframework.web.context.ContextLo
tomcat启动报错:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener直接原因:因为tomcat - webapps - 项目,里面缺少了初始化需要的class文件。可能导致的原因:可能是因为在IDE里面clean了项目,而又没有及时的在target中编译出新文件,此时就publish到tomcat了。解决流程:...原创 2022-06-08 08:50:17 · 3604 阅读 · 0 评论 -
swing 项目,打包、找不到图片、打成EXE找不到环境的问题
1. 创建项目1.1 普通java项目可以直接创建java项目,然后把各种依赖包都贴进来。项目结构:在src里面写swing代码即可。有依赖资源直接贴进来(dll、so、图片等),不用创建resource文件夹。1.2 maven项目资源文件可以放在resources里2.程序读取图片路径代码URL logoUrl = this.getClass().getResource("/xxx.jpg"); // 打包后class的根...原创 2022-05-12 09:28:41 · 690 阅读 · 0 评论 -
OPC DA 服务端搭建 (附Java 客户端代码)
1、如果不清楚用户组针对哪些服务权限,就不操作用户组。给所需要的服务权限控制上直接加用户就可以了。2、经测试,客户端的用户名和服务端的一样都是admin,但是密码不同,依然可以调用opc服务端。3、连接失败的原因,基本都由于服务端的配置(包括授权配置、网络配置),或者程序中参数写错(或找错)导致。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。............原创 2021-07-28 09:32:55 · 15677 阅读 · 13 评论 -
getoutputstream() has already been called for this response 返回对象中带有JSONObject时报错
背景 SpringMVC框架,添加了一个AOP切面,用来拦截部分请求的返回数据,在返回之前加入一些特殊操作逻辑。原创 2021-06-19 11:27:17 · 646 阅读 · 0 评论 -
SpringBoot AOP & Interceptor Demo
spring支持@Aspect //定义一个切面@Component // 系统启动自动注入spring容器@Slf4j // 日志支持public class LogRecordAspect {private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class); // 定义切点Pointcut // public : 指方法类型,只有public的方法才会拦截 .原创 2021-06-17 11:31:51 · 283 阅读 · 1 评论 -
mybatis-plus 指定列指定值排序
问题:由于使用mybatis-plus的查询功能,是通过封装querywrapper实现的,SQL可控性不高,有部分逻辑不好控制,例如排序。方案:使用last方法补充尾部逻辑(https://baomidou.com/guide/wrapper.html#last)样例1:通过更新时间和创建时间倒序排序QueryWrapper<Employee> queryWrapper = QueryGenerator.initQueryWrapper(employee, req.getPa原创 2021-04-30 13:46:23 · 14442 阅读 · 0 评论 -
springBoot 配置项外提结合容器化
SpringBoot的部署上,个人习惯于代码部分打入镜像,配置项以外部挂载的方式进行关联,从而进行代码和配置的解耦合。在部署不同环境的时候(例如,test、dev、staging、product)只需要一个镜像即可,只需创建对应的配置对象即可。这里的配置对象在docker上可以是文件夹,每个文件夹对应一个环境,docker run的时候通过 -v 命令进行关联,在kubernetes上可以是一个configMap对象。需要外提的配置项一般有application.porperties一族(applica原创 2020-10-12 10:31:30 · 304 阅读 · 1 评论 -
使用 @Transactional注解之后 其它已打注解消失
背景SpringBoot项目,创建了一个serviceImpl共厂,为每个serviceImpl打了一个服务类型的注解,注解的内容匹配服务类型,实现自动选择服务调用的功能。时序图类图问题svcs是所有接口的实现类,通过获取注解的值判断需要调用哪个实现类。可是在加入@Transactional之后,发现FeedBackAnno注解消失了,无法获取值。解决因为@Transactional注解是通过动态代理的方式,导致生成的代理类没有继承serviceImpl中的注解,根本原.原创 2020-08-13 16:24:27 · 344 阅读 · 0 评论 -
java 数组类型 获取迭代器 array => iterator
今天在做数组循环时,由于不需要考虑索引值,因此想用迭代器的方式去实现,在网上查了一下竟然都是ArrayList获取迭代器的,或者就是把array转成ArrayList再获取迭代器。但是我是想直接获取数组的iterator。思路:数组是内存地址连续的内存集合,只要获取数组对象的首地址就能获取到其首个对象,然后通过地址指针的移动就可以实现迭代的功能。因此数组使用迭代器应该是可行的。Annotation[] annotations = XXX.getClass().getAnnotations();I原创 2020-08-13 16:07:55 · 1694 阅读 · 1 评论 -
记Java的多态
重载和重写体现了Java的多态。重载(overload)就是在同一个类中,方法名称相同,参数列表中的参数类型或个数不相同。重写(override)发生在父子两个类中,方法名,参数列表完全相同,子类重写了父类方法。重载重写对比 重载 重写 发生在同一个类中。相同方法名,参数列表中参数的种类及数量不同。 有继承关系,发生在父子类中 属于静态绑定 属于动态绑定 发生在编译期 发生在运行期 适用于所有方法 final、static、private修饰的不能原创 2020-08-04 15:50:19 · 132 阅读 · 0 评论 -
Java中的 栈、堆栈、堆、堆排序、优先队列的理解
引言在学习Java内存分配的时候就讲过,引用(句柄)存放在栈上,对象存放在堆上。引用是一个(16进制的数字)地址指向了堆中的实际对象。可以有多个引用同时指向一个对象,其中任意一个引用修改了对象,由于其它引用指向的是同一个对象,导致所有引用指向的对象都发生变化。然而,基本类型的变量(例如, int i = 0, j = 0;)修改i的值,不会影响到j的值。因为它们是分配在栈上,彼此独立的。=========================割=========================原创 2020-08-03 10:28:22 · 499 阅读 · 0 评论 -
mybatis jdbcType表数据类型对应
Mybatis中javaType和jdbcType对应关系:JDBC Type Java TypeCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT ...原创 2020-07-30 15:03:14 · 2010 阅读 · 0 评论 -
ReactiveX/RxJava V3.0.0版本
最近使用加载文本数据到内存中,提供web服务的方式,由于文件比较大,导致load数据非常消耗内存,4G的文本,每行数据封装对象存在hashmap中运行期竟然消耗了23G内存。后改用JDK8的stream.map.foreach的方式,效果也不好,最终被要求用rxJava来处理数据流。GITHub原文:https://github.com/ReactiveX/RxJava,现摘取部分内容稍作翻译...原创 2020-05-07 16:31:29 · 1423 阅读 · 0 评论 -
java 获取对象的字节数
Java中没有类似C++的sizeof函数,用于返回对象在内存中占用字节数。经查找,在jdk1.5开始,由jdk提供了一个工具包,可以获取对象大小java.lang.instrument.Instrumentation,但是这是一个接口,无法获取其对象,需要在代码启动时加入VM参数-javaagent参数来指定jar位置才能使用。现已经写好了代码上传到了GITHub,代码主要做了两件事,一个...原创 2020-04-28 10:21:50 · 3755 阅读 · 0 评论 -
Java多线程 sleep wait yield 对比图表
java.lang.Object类中包含wait方法,及notify,notifyAll方法。wait会等待notify唤醒,re-obtain(重新获取)表示会释放锁。java.lang.Thread类中包含sleep,yield方法,且是静态方法。睡眠当前线程,不会释放锁。释放当前CPU资源。防止CPU过度使用的情况。用的很少。...原创 2020-04-24 09:40:38 · 287 阅读 · 0 评论 -
【译】Java NIO DatagramChannel
Java NIO中的DatagramChannel是一个可以收发UDP(User Datagram Protocol)包的channel。由于UDP是一个异步连接(面向无连接)的协议,因此你不能像那些channel一样使用默认的read和write方法。打开一个DatagramChannel调用open方法,然后绑定一个地址:DatagramChannel channel = D...翻译 2020-01-08 09:20:03 · 169 阅读 · 0 评论 -
【译】Java NIO Pipe
Java NIO的pipe是两个线程之间的单向数据连接。每个Pipe都有一个源(source)channel和一个接收(sink)channel。你把数据写到sink channel中,这些数据可以被source channel读取。图示:创建一个Pipe你可以调用Pipe的静态方法open来创建pipePipe pipe = Pipe.open();向Pipe写数据如果...翻译 2020-01-08 09:19:59 · 129 阅读 · 0 评论 -
【译】Java NIO AsynchronousFileChannel
在Java 7中NIO部分新增了AsynchronousFileChannel。AsynchronousFileChannel可以异步的读写文件了。下面教程介绍了它的用法。创建一个AsynchronousFileChannel通过它的静态方法open可以创建一个对象:Path path = Paths.get("data/test.xml");AsynchronousFileCh...翻译 2020-01-08 09:20:45 · 153 阅读 · 0 评论 -
【译】Java NIO ServerSocketChannel
Java NIO中的ServerSocketChannel是用来监听TCP连接的,就像Java网络标准中的ServerSocket类一样。ServerSocketChannel类位于java.nio.channels包里。监听一个TCP连接的例子:ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();...翻译 2020-01-07 16:40:21 · 154 阅读 · 0 评论 -
【译】Java NIO SocketChannel
Java NIO的SocketChannel是一个用来连接TCP网络的channel。有两种方式创建:open一个SocketChannel并连接到internet上的某个服务器。 当有一个ServerSocketChannel连接来了,就创建一个SocketChannel。open一个SocketChannelSocketChannel socketChannel = Socket...翻译 2020-01-07 16:39:29 · 170 阅读 · 0 评论 -
【译】Java NIO FileChannel
Java NIO中的FileChannel是一个用来连接文件的通道。使用这样一个channel,可以读也可以写文件。值的注意的是,FileChannel不能被设置成非阻塞模式(setBlockingMode(true)是不允许的),它只能在阻塞模式下运行。打开一个FileChannel在使用它之前,必须先把它打开。你不能直接打开它,必须通过一个输入流(InputStream)或者输出流...翻译 2020-01-07 16:38:45 · 125 阅读 · 0 评论 -
【译】Java NIO Selector
Java NIO Selector是一个组件,它可以检测Channel对象,并且决定哪些channel是已经ready、readable、writable等状态。通过这个组件,一个线程可以管理多个channel,进而管理多个网络连接。为什么使用Selector只使用一个线程来处理多个Channel的优势是,需要更少的线程来处channel。事实上,你可以使用一个线程管理所有的channel...翻译 2020-01-07 16:37:54 · 150 阅读 · 0 评论 -
【译】Java NIO Channel to Channel Transfers
在Java NIO中可以直接从一种channel转化成另一种channel。例如,FileChannel类有一个transferTo的方法和一个transferFrom的方法,都可以做channel转化。transferFrom()FileChannel.transferFrom()可以把源channel转发成FileChannel,例如:RandomAccessFile fromF...翻译 2020-01-07 16:37:13 · 195 阅读 · 0 评论 -
【译】Java NIO Scatter / Gather
Java NIO原生支持scatter和gather。Scatter/Gather是从channel中读取或者是向channel中写入时的概念。一个scatter类型的reading操作,就是一次读操作中会读取多个buffer。一个gather类型的writing操作,就是一次向channel中写入多个buffer。在需要分别处理传输数据的各个部分的情况下,Scatter/Gather...翻译 2020-01-07 16:36:26 · 130 阅读 · 0 评论 -
【译】Java NIO Buffer
Java NIO的Buffer通常是用来和Channel作交互的。如你所知的,数据的读取是通过channel到buffer的,而数据的写入,是从buffer到channel的。Buffer的本质是内存中的一个可读可写的数据块,这个数据块由NIO的Buffer对象封装,提供了一系列的支持内存操作的函数。Buffer的基础用法使用buffer,读写数据一般来说都有以下四步:把数据写入到...翻译 2020-01-07 16:35:56 · 130 阅读 · 0 评论 -
【译】Java NIO Channel
Java NIO中的Channel和Stream很像,但是又有一些不同点:在Channel中可读也可写(双工)的。一般来说Stream是可读或者可写(单工)的。 Channel的读和写可以是异步的。 Channel面向的是Buffer。正如上面提到的,通过Channel可以读又可以写,下图说明了这一点:Channel的实现下面列出了一些重要的实现类:FileChannel...翻译 2020-01-07 16:35:16 · 120 阅读 · 0 评论 -
【译】Java NIO 概览
Java NIO包含了如下几个核心组件:Channels Buffers SelectorsJava NIO 有比这多得多的类和组件,但是依我看来,这三种是这套API的核心架构。其它的组件,例如Pipe,FileLock等,仅仅是用来联系这三个核心组件的工具类而已。因此,我将主要介绍这三个核心组件。Channels 和 Buffers一般来说,所有的NIO都是以Channel起手...翻译 2020-01-07 16:34:16 · 132 阅读 · 0 评论 -
【译】Java NIO简明教程
java NIO(New IO,YouTube上普遍读作/'nɪəʊ/ 而不是N-I-O),是Java1.4之后提供的一套可选的IO API,可以替换标准的Java IO API和Java 网络IO API。NIO是一种完全不同于传统IO的工作方式。Java NIO:Channel 和 Buffer在传统的 IO API中,面向的对象是字节流(byteStream)或者字符流(char...翻译 2020-01-07 16:32:44 · 119 阅读 · 0 评论 -
Java 运行内存学习笔记
虚拟机Java虚拟机(Java Virtual Machine)是用来屏蔽底层硬件的,它负责把字节码(*.class)文件翻译成机器码,从而达到跨平台的目的。java源代码先通过编译器编译成class文件,再经过特定的JVM(不同的操作系统下JVM不同)翻译成操作系统能看懂的机器码。因此JVM不局限于Java语言,它面向的是一个字节码规范,如果能把其它语言代码(如PHP)编译成正确的C...原创 2019-12-27 16:16:57 · 162 阅读 · 0 评论 -
Java《设计模式》读书笔记
设计设计思路Java三大特性:封装、继承、多态。当没有系统的了解过设计模式的时候,只知道书本上的定义,尽管背的挺熟,但是对实际应用还是一知半解。经常会提出一些疑问,例如,抽象类和接口不是一样吗?它们之间是可以互相替换的吗?抽象类和普通类有什么区别?如果我定义一个普通类当作抽象类一样作为超类使用,不也是没问题的吗?其实这一切都是在没有设计的范畴之内讨论的,如果有了设计模式,就会对这些问题有一...原创 2019-12-13 18:17:10 · 527 阅读 · 0 评论 -
泛型的 上下边界约束
package com.rq.util.module.exercise.capture;/*** 频繁读取内容的使用 上界(extends)* 频繁插入的,用下界(skuper)* @author rq**/public class TestCapture2 {@SuppressWarnings("unused")public...转载 2019-03-21 18:13:14 · 791 阅读 · 0 评论 -
向上转型 父类的引用指向子类
原创 2019-02-01 10:29:11 · 288 阅读 · 0 评论 -
ReenTrantLock可重入锁(和synchronized的区别)总结
可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 锁的实现:Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系...转载 2019-02-01 10:30:26 · 122 阅读 · 0 评论 -
java String 真实长度
实例如下:public class Char_cn { public static void main(String[] args) { // TODO Auto-generated method stub String haha = "我叫兜兜abcd"; int true_num = String_length(haha); System.out.printl...转载 2019-02-01 10:31:40 · 1931 阅读 · 0 评论 -
try catch finally
执行流程: try -- catch --finally -- main 无论 try还是catch中有return,都会被finally中的return 代替每个return 都是一个覆盖内容到指定地址的操作原创 2019-02-01 10:33:59 · 112 阅读 · 0 评论 -
java 数值极值
Integer.MIN_VALUE = -2147483648Integer.MAX_VALUE = 2147483647Long.MIN_VALUE = -9223372036854775808Long.MAX_VALUE = 9223372036854775807Float.MIN_VALUE = 1.4E-45Float.MIN_NORMAL = 1.17549435E-...原创 2019-02-01 10:34:38 · 920 阅读 · 0 评论