java
(def p [])
stand your ground!
展开
-
软件的腐化之路
软件腐化之路本文并不是吐槽,而是总结开发过程中软件腐化的各种原因,希望基于此思考如何解决软件腐化的问题.需求不明确项目已有第n个版本,现开发第n+1个版本,但是需求不明确,导致可能无法将新需求融入到现有的设计,可能要调整现有设计,可能不要改.如果需求不明确,又要开始干活,那么可能到需求明确的时候,已经没有资源去做相应的调整了,这个时候通常会用各种hack方式实现功能,为后期版本埋坑.定义不...原创 2020-05-03 19:18:58 · 468 阅读 · 0 评论 -
alibaba-druid里面的LRU缓存实现
内容从druid包里面拷贝的package org.jsirenia.cache;import java.util.LinkedHashMap;import java.util.Map;//copy from com.alibaba.druid.util.LRUCache;public class LRUCache<K, V> extends LinkedHashMap&l...原创 2018-12-05 20:36:34 · 602 阅读 · 0 评论 -
java版js数组
背景:java数组、列表的抽象程度不够,操作起来相对麻烦。相比而言,js数组方便很多。于是参考js的数组api,对java数组(列表)进行抽象,可以非常方便地进行平常的一些操作。依赖:只是在toString方法中依赖了fastjson,所以就不贴pom.xml了。代码:1、接口package org.jsirenia.array;import java.util.Comparato...原创 2018-12-05 20:32:57 · 365 阅读 · 0 评论 -
自己实现持久层框架
jdbc-template项目背景用过hibernate、mybatis,了解过spring的jdbc-template。觉得hibernate框架太重太复杂,sql优化不方便。mybatis强制使用xml配置提供sql(注解方式提供sql能力有限,provider方式提供sql也不方便),而且要配置ResultMap、关联查询又要比较复杂的配置,多表关联查询时对不同表字段名相同的情况处理...原创 2018-11-18 08:37:18 · 1181 阅读 · 0 评论 -
groovy执行sql简单示例
这里主要展示groovy为了代码的执行方便,竟然将依赖在脚本中指定。简直是太方便了。import groovy.sql.Sql//可以指定maven仓库@GrabResolver(name = 'aliyun', root = 'http://maven.aliyun.com/nexus/content/groups/public/')//jdbc驱动类需要用Class.forName...原创 2018-11-07 19:49:17 · 5379 阅读 · 0 评论 -
java调用groovy
最近学习了一下groovy,发现这门语言身上有scala的影子(或者相反)。使用起来非常的简洁,而且无缝调用java,真的非常棒。那么反过来,java调用groovy呢?由于groovy是动态语言(这里先不讨论groovy编译成字节码),java是静态编译的,所以java要调用groovy,编译器并不知道groovy会定义一些什么,所以就和java调用js的情况一样了(事实上都是java调用s...原创 2018-11-07 19:37:11 · 805 阅读 · 0 评论 -
spring整合hessian简化rpc调用
maven配置:略服务端HessianServiceExporterController.java/** * web.xml中不需要额外的servlet. * 对于hessian调用的理解,实际上就是http请求,然后在请求头加了特殊的Header, * 请求体的内容使用hessian协议序列化和反序列化。 * spring提供了HessianServiceExporter,封装了协...原创 2018-10-19 19:21:30 · 456 阅读 · 0 评论 -
java-nio学习
https://zhidao.baidu.com/question/557288047.htmlhttp://blog.sina.com.cn/s/blog_751bd9440102x571.htmlhttps://www.cnblogs.com/dolphin0520/p/3919162.htmlhttps://www.sohu.com/a/231626534_827544转载 2018-10-13 15:07:19 · 112 阅读 · 0 评论 -
第一次用kafka
maven配置依赖<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.9.0.1</version> <exclusions&am原创 2018-10-13 11:05:42 · 150 阅读 · 0 评论 -
基于javassist实现aop
背景:系统集成测试,需要写mock(单元测试有spock等mock工具)。于是基于spring的aop实现了一个mock框架,可以用于集成测试。但是只能对spring管理的bean进行mock。对于有些工具类,是没办法mock的,比如一些加解密,签名验签,都是用静态方法实现的。于是寻找一些解决方案,希望尽可能的减少侵入性,实现对静态方法、非spring对象的mock。思路是在类加载之前...原创 2019-06-12 21:28:45 · 738 阅读 · 1 评论 -
优雅停机-dubbo篇
dubbo中使用了netty,但是它修改了netty的代码,其中有个bug,导致无法优雅停机。下面的代码用于解决这个问题。package org.jsirenia.dubbo;import java.lang.reflect.Field;import java.lang.reflect.Method;import javax.annotation.PreDestroy;impor...原创 2019-06-12 21:35:21 · 682 阅读 · 0 评论 -
服务启动时序解耦
package org.jsirenia.defer;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import org.jsirenia.util.Callback.Callback00;import org.slf4j.Logger;import org.slf4j.LoggerFactory...原创 2019-06-12 21:38:00 · 341 阅读 · 0 评论 -
js实现java字符串的hashCode方法
java的int类型占4个字节。在计算字符串的hashcode时,可能会溢出。这种溢出属于正常情况。在js中,所有数字都是以64位浮点数形式储存。其表示范围要远远超过java32位的int。所以在js要实现java字符串的hashCode方法,就需要主动让其值产生溢出效果。有什么用呢?更深入理解java字符串的hashCode方法理解数值计算的溢出处理连接js和java字符串处理ja...原创 2019-09-24 23:09:02 · 2453 阅读 · 0 评论 -
asm实现aop,不是简单的打印方法执行时间
源码 https://github.com/zhoujiaping/asm0看org.wt.asm.aop包里面的内容实现了一个通用的aop,使用时写常规的java代码就可以了。原创 2019-09-07 23:27:38 · 282 阅读 · 0 评论 -
基于javaagent实现的mock框架
背景项目有点规模,使用dubbo框架,类似微服务的方式将项目分成了多个模块。各个模块逻辑复杂,而且调用了大量的外部接口。开发时自测面临以下问题:测试某个模块时,需要启动各个上游模块,以及上游模块的上游模块。业务逻辑复杂,需要有完备的测试数据,才能成功调用各个接口。项目中的加解密功能设计的不好,难以绕过加解密签名验签通过传入准备好的明文直接进行调用。有时候,不仅仅需要对外部接口进行moc...原创 2019-08-10 22:41:00 · 2200 阅读 · 1 评论 -
基于redis实现限流器
package org.jsirenia.ratelimit;import java.io.FileNotFoundException;import java.util.List;import org.jsirenia.file.MyFile;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.spri...原创 2019-06-12 21:52:47 · 1172 阅读 · 1 评论 -
redis实现队列
package org.jsirenia.queue;import java.util.List;public interface RedisQueue { void clear(); boolean isEmpty(); String peek(); int add(String... source); List<String> peek(int coun...原创 2019-06-12 21:50:42 · 810 阅读 · 0 评论 -
java8日期时间工具类
package org.jsirenia.date;import java.io.Serializable;import java.time.DayOfWeek;import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;i...原创 2019-06-12 21:48:38 · 5347 阅读 · 0 评论 -
线程工具类
package org.jsirenia.thread;import java.lang.Thread.UncaughtExceptionHandler;public class ThreadUtil { public static class ThreadException extends RuntimeException{ private static final long se...原创 2019-06-12 21:45:39 · 174 阅读 · 0 评论 -
懒初始化的map
package org.jsirenia.defer;import java.util.Map;/*** * 第一次get的时候,调用初始化方法。 * @author zhoujiaping 2019-04-23 * */public class LazyInitMap<K,V>{ private Map<K,V> map; private bool...原创 2019-06-12 21:39:17 · 313 阅读 · 0 评论 -
jetty服务器
maven配置依赖 <!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server --> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server&...原创 2018-10-13 10:53:19 · 212 阅读 · 0 评论 -
代理服务器实现
基于apache的httpclient实现。配置依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency&原创 2018-10-13 10:42:37 · 816 阅读 · 0 评论 -
java hashmap原理分析
/** * 1、hashmap中维护了一个节点数组。 * 2、字符串的hashcode计算方法为h = 31 * h + val[i]; * 意思是把字符序列当成31进制的数值 * 3、put时,计算hash值 hash= h ^ (h >>> 16) * 然后计算存放到数组元素的索引,i = (n - 1) &...原创 2018-05-12 17:47:53 · 140 阅读 · 0 评论 -
spring-expression
spring-expression实现功能:比如将“select * from user where name like #{name} and age>#{age}”模板,根据User user = new User();的属性替换得到最终字符串。 <dependency> <groupId>org.springframework<...原创 2018-04-26 16:32:12 · 2316 阅读 · 0 评论 -
reids分布式锁实现
` public abstract class RedisLockCallback implements Callback{ //private Logger logger = LoggerFactory.getLogger(RedisLockCallback.class); private static final Logger logger = Logger.getLog...原创 2018-05-09 13:25:02 · 284 阅读 · 0 评论 -
拓展shiro的字符串权限匹配
shiro框架中,可以使用字符串匹配权限。 比如user:query匹配查询用户的权限。 user:*可以匹配user:query,user:delete等。 然而,却不可以匹配user:id:query。即不可以跨级(分隔符:将字符串分为多个级)。 这里提供了一个可以多级匹配的实现。MyRealm.javapublic class MyRealm extends Authoriz...原创 2018-03-15 16:34:55 · 2767 阅读 · 2 评论 -
关系型数据库树形结构实现-物化路径模型
一般系统中都会有需求在数据库中存储树形结构。如果系统中用的是非关系型数据库如mongodb,那么没什么好说的。如果系统中用的是关系型数据库,由于关系型数据库天生的表结构,在描述树形结构的时候,不那么直观,在对树进行操作时,并不方便。通常数据库中描述树形结构采用的是邻接表模型。这种模型,每条记录代表树中的一个节点。每个节点有id字段,和一个关联父节点的字段pid。对于常用的操作,添加一个叶子原创 2017-07-02 09:32:33 · 3198 阅读 · 0 评论 -
mybatis源码解析
mybatis源码解析准备工作:到mybatis官网,学习基本的用法。http://www.mybatis.org/mybatis-3/zh/statement-builders.html在eclipse中搭建环境,新建demo项目。代码 package cn.howso.mybatis;import java.io.IOException;import j原创 2017-06-29 14:31:12 · 1360 阅读 · 0 评论 -
完美的mybatis通用dao实现
场景:项目中用到mybatis(版本3.3.2)。对于单表操作,我们一开始是手写各个sql。但是这样接口非常不一致,而且有太多的小接口,不方便将相似功能合并。而且由于实现不一致,不能只根据接口名判断具体执行的sql,而且不能保证没有bug。后来我们用mybatis-generator插件,自动生成model、example、mapper.xml、mapper.java。但是又引入了新的问题。表...原创 2017-06-29 13:39:42 · 8338 阅读 · 2 评论 -
深入理解java范型
1、要理解java编译和解释执行的过程。在各过程中,范型的存在性、存在方式、被处理方式。2、编译器编译源代码时,会检查范型,防止类型出错。例如:List usernames = new ArrayList();将不能通过编译。它将源代码编译为字节码,这时候的字节码,与没有使用范型编译过来的字节码比较,多出了一些范型信息。但是这些范型信息的有无,对于JVM是一样的(如果不考虑反射)。原创 2016-06-13 21:53:45 · 381 阅读 · 1 评论 -
java Set原理分析
java中的Set都是用对应的Map实现的。比如HashSet是由HashMap实现的,TreeSet是由TreeMap实现的。 只要将map的value都设置成null,那么它们的key就组成了一个Set。原创 2018-05-12 17:52:12 · 3082 阅读 · 0 评论 -
java LinkedHashMap实现原理
LinkedHashMap继承了HashMap,只是给Node增加了before和after两个引用,用来保存上一个元素和下一个元素,将它们连接起来。然后基于两个引用,实现了一些方法。...原创 2018-05-12 17:56:49 · 159 阅读 · 0 评论 -
前端传嵌套对象参数给spring mvc
在使用springmvc开发web应用时,感觉springmvc的controller方法能自动将参数注入到方法的参数对象中,极大的方便了开发。但是,在遇到有嵌套对象的时候,比如订单对象有个属性是用户对象,就不好处理了。一种情况是,传递的参数都是作为post方法的请求体,我们可以用RequestBody注解。但是当条件不满足的时候,这种方式就没法用了。很多人喜欢用的方法是将对象序列化为json字符...原创 2018-05-20 21:21:36 · 4402 阅读 · 1 评论 -
dubbo filter记录接口参数日志
实现效果:dubbo的provider和consumer接口调用的入参和出参都会打印日志。dubbo配置 <dubbo:consumer check="false" filter="dubboConsumerLogFilter"></dubbo:consumer> <dubbo:provider filter="dubboProducerLogFilter"/..原创 2018-09-24 18:40:54 · 4248 阅读 · 0 评论 -
对java调用javascript的封装
maven依赖&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;原创 2018-09-19 12:23:26 · 707 阅读 · 0 评论 -
身份证相关代码
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.time.Instant;import java.time.LocalDate;import java.time.ZoneId;...原创 2018-09-05 20:11:37 · 5629 阅读 · 2 评论 -
java8日期api学习
package test.java8datetime;import java.time.Clock;import java.time.DayOfWeek;import java.time.Duration;import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import...原创 2018-07-21 11:02:59 · 1039 阅读 · 0 评论 -
基于zookeeper实现配置文件共享
` Config.java public class Config{ public static final String CONFIG_PATH = “/module1.properties”; private Map原创 2018-06-27 08:51:20 · 1023 阅读 · 0 评论 -
ArrayIndexOutOfBoundsException: 2925
启动一个java项目时遇到异常 ArrayIndexOutOfBoundsException: 2925 原因:项目中用了spring,版本较低,并且代码中用来java8的lambda语法, spring不支持。为什么spring会和java8语法挂钩?因为项目中用到了spring 的切面功能,而且还是用的代码编织功能。或者是因为项目中依赖了一些字节码工程的jar,java8的字节码它们不...原创 2018-05-23 11:30:54 · 964 阅读 · 0 评论 -
字符串格式化
例如: String s = "hello ,{{target}}" map.put("target","world"); String res = format(s,map); public String format(String template,Map&lt;String,Object&gt; vars){ if(templ原创 2018-05-07 21:18:32 · 315 阅读 · 0 评论