
java
文章平均质量分 51
qq_20009015
欢迎关注我的公众号《程序员与王子喵》
展开
-
java注解的本质以及注解的底层实现原理
java注解到底是什么? 是类 还是接口,还是抽象类 ,在java里面是怎么生效的?注解也叫声明式接口,那么真的是接口吗?以下是验证过程:创建注解Test2通过idea的查看类继承关系的功能,可以看到@Test2继承了Annotation 接口Annotation 可以在jdk包里面找到,它是所有注解的父接口现在我们知道 注解是一个继承了Annotation的东西,那么@Test2 到底是类,还是接口,还是抽象类?那么去字节码中找答案,自定义注解之后,我们需要在某个时刻将注解取出来,好取原创 2020-05-10 17:30:50 · 31979 阅读 · 17 评论 -
ClassLoader.getResources 能搜索到的资源路径
代码如下 public static void main(String[] args)throws Exception { ClassLoader cl = xxxx.class.getClassLoader(); Enumeration resourceUrls =cl.getResources("com/souche/"); while(r...原创 2020-05-07 10:07:21 · 1138 阅读 · 0 评论 -
java根据文件模版生成代码步骤
最近在研究idea的插件,想写一个自动代码生成插件,用到这块的知识点。大概就是是根据自定义的模版,然后填充模版生成代码。首先这里是使用的 org.apache.velocity 这个工具类,所以项目里面需要先引入这个依赖。Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅使用简单的模板语言(template language)来引用由jav...原创 2020-02-04 16:27:01 · 4068 阅读 · 3 评论 -
开源钉钉报警框架
地址 https://github.com/xiaoxinglai/ding介绍基于钉钉开放平台提供的api 封装的一个用于在钉钉群里面使用钉钉机器人发送通知消息或者报警信息的框架。 支持多个机器人,静默,异常信息保存 等。多个机器人时分别计算限流,因为钉钉官网上介绍每个机器人每分钟只能发20条消息,如果超过 会被禁止10分钟。 因此框架内的配置的每个机器人都单独计算限流,不会触发禁止。...原创 2020-01-31 23:38:55 · 1825 阅读 · 0 评论 -
在枚举里面定义方法以及原理
有些场景下,根据某个key值 去决定调用哪个方法, 除了if else之外定义在枚举里面也是一种方式 ,比 if else 好用有两种实现,一种是抽象方法 ,如下package com.souche.sfs.server;import java.util.function.Function;public enum MethodEnum {//定义方法1 以及其对应的code ...原创 2019-12-27 10:03:20 · 2303 阅读 · 0 评论 -
String中intern方法和常量池详解
intern方法的作用: 在jdk1.7版本以后,查看常量池中有没有该字符串的常量,如果没有,就将该字符串的引用放到常量池,如果有,则返回该字符串。在jdk1.7以前,,查看常量池中有没有该字符串的常量,如果没有,就将该字符串拷贝一份放到常量池,如果有,则返回该常量的引用。先看以下代码,判断下输出是什么? String s = new String("1"); ...原创 2019-11-18 02:05:48 · 392 阅读 · 0 评论 -
SpringAop切面中获取方法的返回值
场景:需要用到aop统一接口异常的返回值当接口抛出异常的时候封装成response对象,但是如果不同接口要返回的response不同,需要在执行前获取到接口返回值的类型如果要取到方法的返回值,需要先获取到method的对象遵守这个思路可以看到 around方法的参数类型ProceedingJoinPoint 是一个接口该接口的方法 joinPoint.getSignature() 会...原创 2019-11-07 18:03:38 · 24113 阅读 · 4 评论 -
记一次对java抽象封装的理解和实践
父类是easyexcel的AnalysisEventListener类,用于写解析excel的业务逻辑结构如下/** * @author jipengfei */public abstract class AnalysisEventListener<T> { /** * when analysis one row trigger invoke functi...原创 2019-05-15 21:46:01 · 1307 阅读 · 2 评论 -
java正则表达式判断日期
public static void main(String[] args) { String pattern ="\\d{4}(\\-|\\/|.)\\d{1,2}\\1\\d{1,2}"; // 应收日期 2019/1/1 // 2019-01-02 // 2019.02.02 // 20190909 ...原创 2019-05-15 15:24:15 · 11786 阅读 · 2 评论 -
String转bigDecimal
场景,用户导入的excel里面,金额可能是123123.00 也可能是123,123.00 这几种情况。如果直接BigDecimal.valueOf(Double.parseDouble("123,123.00"));这样会转化异常。java.lang.NumberFormatException: For input string: “123,123.00” public static...原创 2019-05-15 10:39:21 · 9337 阅读 · 1 评论 -
forkjoin并行框架实践
@Override public List<TaxForeDTO> getTaxForeForkJoin(List<String> organizeId, String uid, Date Begin, Date end) throws Exception { Long begintime=System.currentTim...原创 2019-05-07 01:09:25 · 310 阅读 · 2 评论 -
延时消息队列
https://blog.youkuaiyun.com/qq_20009015/article/details/89981008 这个场景场景,有两个接口分别会接收两个数据,如果其中一个数据校验失败,那么另一个数据也要删掉。由于是两个独立的数据源,没法做事务的回滚。( 这两个数据源是来自canal的监听得到的)。因此考虑的方案就是,当校验不通过的时候,通过异步的方式,去起一个线程去删掉另一个接口过来...原创 2019-05-14 10:39:30 · 1485 阅读 · 0 评论 -
maven打包没有主清单属性
直接用maven打的包是无法用java -jar命令运行的 因为没办法找到入口类, 即main方法那么需要加上maven的插件配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3....原创 2019-05-09 11:37:54 · 9639 阅读 · 1 评论 -
手写单例模式的线程池实践
package com.souche.sfs.server.common.util;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.util.concurrent.*;/** * @ClassName CheckAccountThreadPoolUtil * @Author laix...原创 2019-05-08 23:27:23 · 1393 阅读 · 0 评论 -
sleep和wait的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对...原创 2019-05-08 23:24:46 · 83093 阅读 · 16 评论 -
使用Builder模式创建复杂可选参数对象
在新建对象时,若需要对大量可选参数进行赋值,最常见的做法是JavaBeans模式,即调用一个无参构造方法创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数这种模式需要的代码语句繁琐,而且这种做法阻止了把类做成不可变的可能(不可变的类没有set方法,且创建之后没有任何可以更改属性的方法)。更加简洁的一种方式是通过多个构造方法去新建对象。但是这样,就会有多个不同的构造方...原创 2019-04-29 15:03:17 · 1302 阅读 · 0 评论 -
jps jstat命令用法
命令:top显示系统信息jpsjps列出所有java进程jps -l 列出所有java进程的入口jps -v 列出所有java进程 和传递给JVMjps -m 列出所有java进程 和传给main方法的参数jstat 查看内存 类装载 gc信息 等先jps找到指定的线程,然后jstat 命令 线程id 时间间隔 次数比如说 jsat -gc 18615 250...原创 2019-04-20 10:24:33 · 988 阅读 · 0 评论 -
自动装箱和拆箱
package jvm.GC.automaticCasePacker;/** * @ClassName automaticCasePacker * @Author laixiaoxing * @Date 2019/4/20 上午9:54 * @Description 自动装箱 * @Version 1.0 */public class automaticCasePacker {...原创 2019-04-20 10:20:17 · 213 阅读 · 0 评论 -
发生OutOfMemoryError时,程序是否中断
OutOfMemoryError的父类是VirtualMachineError ,VirtualMachineError的父类是error而error和exception都继承自Throwable 。error意味着无法挽回的异常,比如说系统本身的问题,内存不足等等。这个程序自身无能为力,建议程序中止,exception则是可以处理的,建议捕获处理。但是 如果不做任何处理,程序一旦发生异常...原创 2019-04-19 20:38:48 · 804 阅读 · 0 评论 -
迭代器的实践
List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); ListIterator<String> listIterator = list.l...原创 2019-05-15 22:40:49 · 202 阅读 · 0 评论 -
java8的stream取max
java8的stream取max public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); Integer max = list.stream().max((a, b) -> { if (a ...原创 2019-05-28 10:46:43 · 38156 阅读 · 2 评论 -
DelayQueue延时任务队列总结和实践
DelayQueue里面是一个无界的BlockingQueue,且有一个优先级队列而且该优先级队列里面的实现是堆排序,这样每插入一个新的任务,都可以立即调整任务的顺序。DelayQueue里面放的元素必须为实现了Delayed接口的任务。里面有两个核心方法getDelay 用于判断任务是否到期,如果是返回-1 表示任务已经到期我这里用**(创建时间+延期时间-当前时间**)来做判断c...原创 2019-05-30 00:32:07 · 3524 阅读 · 0 评论 -
finally和return的执行顺序,从根本上理解
网上遍布了finally和return的执行顺序问题,也是困扰新手的问题,一堆分析,各种情况。 其实没有必要那么复杂。finally实际上就是,java在将代码编译成字节码的时候,在所有分支的可能性路径里面都复制了一份finally块里面的代码。如果finanlly里面有renturn,那么 整个字节码里面,有且只会有一个return, 那就是finanlly里面的renturn看下如下代码,...原创 2019-10-07 19:22:56 · 1159 阅读 · 4 评论 -
为什么lambda里面要访问局部变量必须是final
MappedFile mappedFile = mappedFiles.get(current); .... msgMap.forEach((k, v) -> { .... mappedFile.appendData(byteBuffer); ...原创 2019-08-15 11:56:50 · 2850 阅读 · 0 评论 -
使用LocalSupport和队列设计一个先入先出的锁
使用LocalSupport和队列设计一个先入先出的锁public class FIFOMutex {/*** 等待队列,只有队首的线程有资格获得锁*/ private final Queue<Thread> waiters = new ConcurrentLinkedQueue<Thread>(); /** * 0 无锁 1 有锁 ...原创 2019-08-10 22:02:42 · 597 阅读 · 0 评论 -
LockSupport工具类学习
jdk的rt.jar包里面的LockSupport是个工具类,主要作用了挂起和唤醒线程,该工具类是创建锁和其他同步类的几次。调用park()系列的方法可以使线程进入阻塞状态,调用unpark方法可以唤醒。功能类似wait和notify,但是不需要像wait和notify那样必须在synchronized的范围内使用且如果先调用了unpark再调用park,此线程是不会进入阻塞状态的,原因是调...原创 2019-08-10 21:09:44 · 172 阅读 · 0 评论 -
java并发包中ThreadLocalRandom类原理剖析
java并发包中ThreadLocalRandom类原理剖析Random类及其局限性ThreadLocalRandom类是jdk7在juc包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷。jdk7之前包括现在,Random类都是使用比较广泛的随机数生成器,Math中随机数生成也是使用的Randmon实例 public Random() { this(seed...原创 2019-08-10 16:35:01 · 256 阅读 · 0 评论 -
并发编程基础进阶(下)
Unsafe类Unsafe类中的重要方法jdk的rt.jar包中的Unsafe类提供了硬件级别的原子性操作,Unsafe类中的方法都是native方法,它们用JNI的方式访问本地c++实现库。long objectFiedOffset(Field field)方法返回指定的变量在所属类中的内存偏移地址(即内存地址),该偏移地址仅仅在该Unsafe函数中访问指定字段时候使用。例如:vav...原创 2019-07-28 17:48:36 · 259 阅读 · 0 评论 -
并发编程基础进阶(上)
1.什么是多线程并发编程首先要澄清并发和并行的概念,并发和指同一个时间段内多个任务同时都在执行,并且都没有执行结束。而并行是在单位时间内多个任务同时在执行。并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时执行。在单cpu的时代多个任务都是并发执行,因为单个cpu同时只能执行一个任务。在单个cpu时代多任务是共享一个cpu的,...原创 2019-07-19 23:35:20 · 647 阅读 · 4 评论 -
java里面的语法糖(糖衣语法)
语法糖是一种用来方便程序员代码开发的手段,简化程序开发,但是不会提供实质性的功能改造,但可以提高开发效率或者语法的严谨性或者减少编码出错的机会。总而言之,语法糖可以看作是编译器实现的一种小把戏。1.泛型和类型擦除泛型的本质是参数化类型,也就是操作的数据类型本身也是一个参数。这种参数类型可以用在类,接口,方法中,分别叫泛型类,泛型接口,泛型方法。但是java的泛型是一个语法糖,并非是真实泛型...原创 2019-04-20 11:26:41 · 4011 阅读 · 0 评论 -
java8中List转map的写法
List list = fundsDetailDao.getCodeAndMoney(startDate, endDate);liststream().collect(Collectors.toMap(CapitalDetailDO::getUniqueCode,t -> t));最终可以转为Map<String,CapitalDetailDO>的map或者为Li...原创 2019-07-01 11:19:54 · 836 阅读 · 0 评论 -
java8的List转map的时候key冲突的解决方案
return list.parallelStream().collect(Collectors.toMap(CapitalDetailDO::getUniqueCode, Function.identity(), (oldValue, newValue) -> newValue));用新的替代旧的原创 2019-07-01 17:25:35 · 4635 阅读 · 0 评论 -
内存溢出之后线程消亡会释放堆内存吗?
通过之前的验证,已经知道,如果一个线程内部发生了内存溢出,会导致这个线程中断且消亡。比如说:设置最大堆为20M然后开启两个线程,一个线程里面不断的读数据 直到内存溢出。...原创 2019-06-09 19:23:34 · 2056 阅读 · 0 评论 -
泛型擦除的验证
会发现这里这两个方法无法重载因为在public Integer method(List stringList);和 public String method(List integers);中参数最终都是在编译时候擦除类型 变成List这样就无法重载了,重载必须方法签名不同...原创 2019-04-19 19:44:15 · 254 阅读 · 0 评论 -
jdk的动态代理以及在框架内的应用分析(代理工厂,mybatis和RPC举例)+原理分析
package proxy.jdkProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @ClassName jdkDynamicProxy * @Author laixiaoxing * @Date...原创 2019-04-18 16:26:55 · 345 阅读 · 0 评论 -
使用easyexcel导出excel文件
这里是导出一个excel文件,里面有两个sheet分别是税赋预测表和发票汇总表controller层 @requestMapping(value = &quot;/exportExcel/taxForecast&quot;, method = Method.GET) public Result&amp;lt;String&amp;gt; exportExcel(String uid, String accountCod...原创 2019-01-31 04:17:21 · 26847 阅读 · 20 评论 -
java导入excel的各自方式分析之easyexcel详解(大文档excel导入避免内存溢出)
导入excel进行数据解析,是日常项目中很经常见到的需求。目前常见的导入excel的工具库有poi和jxlpoi功能丰富,但是较为复杂,jxl简单,但是功能不丰富。但是poi和jxl的导入解析,都有一个致命的问题,就是在大数据量的时候容易内存溢出。当导入6万条数据的时候,内存能占用到100M,如果有20个人一起导入,服务很可能就挂了。在生产环境是很危险的。原因:excel内部存储数据其...原创 2019-01-30 22:14:29 · 10505 阅读 · 0 评论 -
java获取当前时间的上一个月底的时间
/*** @Author laixiaoxing* @Description //获取当前时间的上一个月底的时间* @Date 上午1:57 2019/1/27*/private Date getLastMonthFinallyDate(Date begin) {Instant instant = begin.toInstant();ZoneId zoneId = ZoneId.sy...原创 2019-01-30 16:03:32 · 1944 阅读 · 0 评论 -
apache a b压测工具模拟并发请求
命令ab -n 100 -c 100 http://www.baidu.com-n 表示发出100个请求 -c表示模拟100个并发相当于100个人同时访问 url或者命令 ab -t 60 -c 100-t表示60秒相当于60秒内不停的发请求压测工具还有jmeter等@Controllerpublic class testController { private M...原创 2019-01-21 00:31:19 · 580 阅读 · 0 评论 -
使用eaysexcel时里面的日期转换问题
使用easyexcel进行excel读取时,发现对日期的转换不对,读取到的日期是一个dubble型的浮点数。比如说43458.234189814815经查资料,这个浮点数其实就是excel内部存储时间的形式,也叫时间序列号规则如下:Excel将日期和时间存储为称为日期序列号或日期时序列号的数字。当你在Excel中查看日期时,它实际上是一个常规数字,其格式设置为日期。如果将单元格格式更改为“...原创 2018-12-25 09:42:36 · 18133 阅读 · 1 评论