Java
Ziegler Han
造轮子十年,感悟:尽量不要造轮子。
展开
-
Zmq使用tpc和inproc的效率对比
【代码】Zmq使用tpc和inproc的效率对比。原创 2023-05-26 16:07:46 · 669 阅读 · 0 评论 -
serialization proxy pattern
serialization proxy patternBoth the enclosing class and its serialization proxy must be declared to implement Serializable.public class User implements Serializable { ... private static class SerializationProxy implements Serializable {原创 2021-04-23 14:56:44 · 235 阅读 · 0 评论 -
serialization proxy pattern(序列化代理模式)
import java.io.InvalidObjectException;import java.io.ObjectInputStream;import java.io.Serializable;/** * 序列化的代理模式 * <p>序列化时,调用 {@link User#writeReplace} 方法,创建并序列化的代理对象。不是序列化的{@link User}对象。</p> * <p>反序列化时,实际是用的{@link User.Serializa原创 2021-04-22 11:42:15 · 280 阅读 · 0 评论 -
Java动态代理类Proxy导出写入文件,分析源码实现原理
动态代理的原理:动态代理是通过指定的接口列表,生成一个包含所有接口函数的类,并且这个类的所有实现接口方法都转发到InvocationHandler接口实现的对象的invoke方法。从而实现动态代理的效果。具体通过Proxy.newProxyInstance生成的对象的类是在内存中动态生成的一个类,这个类包含了指定的接口数组中每个接口的每个接口函数集合,另外还包括equals、toString和hashCode方法。这些方法的实现代码同事相同的逻辑,都是把调用转发到指定的实现了InvocationHa原创 2021-03-02 15:10:54 · 557 阅读 · 0 评论 -
解决IDEA Gradle工程控制台输出乱码
修改"build.gradle"文件添加如下内容:tasks.withType(JavaCompile) { options.encoding = "UTF-8"}另外:help>>Edit Custom Properties末尾添加 -Dfile.encoding=UTF-8 (这个方式解决的问题)Settings>>Editor>>File Encodeings 面板 配置 UTF-8...转载 2020-12-30 21:07:21 · 572 阅读 · 0 评论 -
Dubbo RPC线程模型 源码分析
协议启动流程DubboProtocolDubboProtocol.exportDubboProtocol.openServerDubboProtocol.createServerExchangers.bind(url, requestHandler)new DubboProtocolServer(server)HeaderExchangerpublic class HeaderExchanger implements Exchanger { public s.原创 2020-12-29 18:43:32 · 321 阅读 · 0 评论 -
使用gradle方式生成gRPC的Java代码,项目的搭建流程记录
官网看文档:gRPC如何生成代码https://www.grpc.io/docs/languages/java/generated-code/使用idea创建gradle空项目。 添加gradle配置,看这里:https://www.grpc.io/docs/languages/java/generated-code/#codegen 添加proto文件到src/main/proto目录下 运行task中generateProto项目,代码自动生成到目录build/genera.原创 2020-12-22 15:18:35 · 1689 阅读 · 4 评论 -
Java8,编译内部类调用私有方法,会生成对应私有方法的[static synthetic]方法,这样就会导致代码热更失败
public class GameOut { private int outId; private String outName; private InnerA innerA; private int getOutId() { return outId; } private void setOutId(int outId) { this.outId = outId; } private String .原创 2020-11-16 12:19:26 · 422 阅读 · 0 评论 -
db数据的读取与保存策略
数据从db中读取出来,并经数据存储到对象上。对于逻辑对象,最好通过构造或者函数调用将参数传递到对象上。逻辑对象只负责保存数据到db,不处理从db读取数据。这样才能保证逻辑对象对于数据的操作时单向的。package org.ziegler.db.loadAndSave;public class QuestDB { private int questSn; private int questStateIndex; public QuestDB(int questSn.原创 2020-07-25 17:45:49 · 997 阅读 · 0 评论 -
CountDownLatch实现的源码分析,核心基于AQS(AbstractQueuedSynchronizer)
await()调用流程:1. await countDownLatch.await();2. acquireSharedInterruptibly /** * Causes the current thread to wait until the latch has counted down to * zero, unless the thread is {@linkplain Thread#interrupt interrupted}. *原创 2020-07-15 23:55:18 · 229 阅读 · 0 评论 -
感悟:上来就造轮子,不如先思考一下。然后去github上搜索一下,是否已经有现成的轮子。
最近编写一个Log分析工具。分析工具基本完成以后,因为分析工具执行不同的功能。想做成命令行的工作模式。所以,面临命令行参数的解析处理。我也不管三七二十一,直接动手开干,根据自己的想法思路开始造轮子。当时就没有想想是否已经有开源的组件,思想上没有转化。这是对我来说,经历这次开发最大的收获。再次开发新的功能,我要重新调整一下,需要拆分步骤:我要做什么? 我要做的东西功能是否可以拆分。 拆分的功能是否是已经有开源功能块。(先去调研) 动手开发。经过上面的步骤,不仅可以避免重复造轮子,也让自己对于要原创 2020-07-14 13:22:03 · 415 阅读 · 0 评论 -
MyBatis之Mapper的动态代理实现原理
为了方便理解MyBatis的Mapper的动态代理实现原理,下面编写简单的动态代理实现方式,模仿MyBatis的Mapper实现一个UserMapper,通过定义Mapper接口UserMapper,然后调用UserMapper userMapper = MapperFactory.getMapper(UserMapper.class);List<Integer> list = userMapper.getList();获取UserMapper的代理对象,代理对象直接返回一个Li.原创 2020-07-09 17:14:11 · 619 阅读 · 0 评论 -
G1分配大内存测试
package org.ziegler.gc;/** * VM参数:-XX:+UseG1GC -Xms20M -Xmx20M -Xmn10M -Xlog:gc* -XX:SurvivorRatio=8 * */public class FirstTestGC { public static void main(String[] args) { byte[] a1, a2, a3, a4; a1 = new byte[2 * 1024 * 1024]; .原创 2020-07-07 20:38:44 · 725 阅读 · 0 评论 -
JVM(G1)内存不足溢出测试
package org.ziegler.gc;/** * VM参数:-Xms10M -Xmx10M -Xlog:gc* * */public class GCOutOfMemoryTest { public static void main(String[] args) { byte[] a1, a2, a3, a4; a1 = new byte[2 * 1024 * 1024]; a2 = new byte[2 * 1024 * 102.原创 2020-07-07 20:37:37 · 779 阅读 · 0 评论 -
UnPooled.copiedBuffer与wrappedBuffer的使用
Unpooled.copiedBuffer函数public final class Unpooled { /** * Creates a new big-endian buffer whose content is a copy of the * specified {@code array}. The new buffer's {@code readerIndex} and * {@code writerIndex} are {@code 0} ...原创 2020-07-05 10:59:44 · 9281 阅读 · 0 评论 -
AutoCloseable使用与注意,try-with-resources(推荐)
使用try-with-resources(推荐),不要使用try-finally。 实现AutoCloseable接口,并实现close方法。 使用try-with-resources可以捕获close中的异常,通过throwable的getSuppressed 在退出try-with-resources块的时候会自动调用close方法。下面是AutoCloseable的文档说明package org.ziegler.javabase.autoClaseable;public class.原创 2020-07-03 11:56:47 · 610 阅读 · 0 评论 -
Java 8 实战 脑图
原创 2020-07-01 16:03:14 · 274 阅读 · 0 评论 -
Future.get抛出TimeoutException,并不会中断或者取消任务
static ExecutorService executorService = Executors.newCachedThreadPool(); /** * get 出现TimeoutException,并不会中断或者取消运算线程 * @throws InterruptedException */ @Test void testGetTimeoutException() throws InterruptedException { f.原创 2020-06-29 18:00:51 · 2228 阅读 · 1 评论 -
千万不要再构造函数调用重载函数,非要调用函数请使用final函数
构造流程基类的成员数据初始化 >> 基类构造函数 >> 子类成员数据初始化 >> 子类构造函数产生问题的原因但是下面的结构违背了这种构造顺序,子类的init的方法调用要在子类的构造函数之前执行。public class BaseClass { int id = 0; String name = ""; public BaseClass() { System.out.println("BaseClass cons原创 2020-06-27 21:53:21 · 441 阅读 · 0 评论 -
用一年时间读一本英文版书籍
作为一个Coder,一直想提升英文水平,但是看到英文技术文章就心里胆怯。不敢去阅读。去年我下定了决心,准备开始啃一本英文技术书籍。于是购买了《Effective Java》,不仅可以学习英语,提升自己的英文水平。还能提升自己的编程能力。刚开始阅读,没有给自己定什么高要求,一天阅读1页或者2页,甚至半页也可以。但是,有一个要求,必须坚持。开始的是很吃力的,生单词很多,句子可能不理解。有时候1也可能也需要读10分钟或者半个小时。但是这么坚持下来,几个月以后很多以前不认识的单词,开始有印象了。慢慢记住了。原创 2020-06-19 14:51:50 · 682 阅读 · 2 评论 -
Objects.requireNonNull使用的多种使用情形和案例
package org.ziegler.javabase.thread;import java.util.ArrayList;import java.util.List;import java.util.Objects;public class RequiredNonNullSample { private Ball ball; private List<Ball> ballBucket = new ArrayList<>(); Requi.原创 2020-06-18 14:52:49 · 1626 阅读 · 0 评论 -
第3章 Netty的组件和设计
第3章 Netty的组件和设计3.1 Channel、EventLoop和ChannelFuture3.1.1 Channel接口3.1.2 EventLoop接口定义了Netty的核心抽象3.1.3 ChannelFuture接口3.2 ChannelHandler和ChannelPipeline3.2.1 ChannelHandler接口3.2.2 ChannelPipeline接口为ChannelHandler链提供了容器Netty两种发送消息的方式:直接写.原创 2020-06-05 14:30:41 · 211 阅读 · 0 评论 -
第11章 CompletableFuture组合式异步编程
第11章 CompletableFuture组合式异步编程概念:分支/合并框架 并行流 混聚(mash-up)区别:并发 并行11.1 Future接口java5引入,设计初衷:对将来某个时刻会发生的结果进行建模。使用Futrue:将操作封装到Callable对象中 提交给ExecutorService ExecutorService.submit返回Future对象11.1.1 Future接口的局限性11.1.2 使用CompletableFuture构建异步原创 2020-05-28 14:52:34 · 258 阅读 · 0 评论 -
第10章 用Optional取代null
第10章 用Optional取代null10.1.1 采用防御式检查减少NullPointerException深层次递归的if语句块 过多的退出语句10.1.2 null带来的种种问题10.1.3 其他语言的替代品Groovy 安全导航操作符(Safe Navigation Operator) Haskell 的 Maybe Scala 的 Option[T]10.2 Optional入门DIFFnull Optional.empty()10.3 应用Optional原创 2020-05-27 17:56:33 · 223 阅读 · 0 评论 -
第7章 并行数据处理与性能
第7章 并行数据处理与性能7.1 并行流steam.sequential() steam.parallel()最后一次调用会影响整个流水线。上面两个函数只是修改并行标志。配置并行流使用的线程池ForkJoinPoolRuntime.getRuntime().availableProcessors()System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", 12);7.1.4 高效使用原创 2020-05-22 20:25:37 · 496 阅读 · 0 评论 -
Color Scheme : Monokai Sublime Text 3
原创 2020-05-21 14:20:52 · 674 阅读 · 0 评论 -
第6章 用流收集数据
第6章 用流收集数据6.1 收集器简介你只需指出希望的结果 —— “做什么”,而不用操心执行的步骤 —— “如何做”6.1.1 收集器用做高级规约对流调用collect方法将对流中的元素触发一个规约操作。6.1.2 预定义收集器注意:Colletors实用类将流元素规约和汇总为一个值。 元素分组 元素分区6.2 规约和汇总import static java.util.stream.Collectors.*;Collectors.counting stream原创 2020-05-19 14:49:17 · 265 阅读 · 0 评论 -
第5章 使用流
第5章 使用流5.1 筛选和切片filter distinct limit skip5.2 映射map flatmap [重要]:让你把一个流中的每个值都换成一个流,然后把所有的流连接起来成为一个流。[P90] peek:This method exists mainly to support debugging, where you want to see the elements as they flow past a certain point in a pipeline5.原创 2020-05-15 10:06:05 · 226 阅读 · 0 评论 -
IDEA. Code Completion
快捷键:Ctrl+Shift+Space快速变 !boolean.not 快速给boolean返回值进行否处理(即再变量前加!)// 输入.notfor (String str : strings) { if (str.isEmpty().not)}// 回车后变为for (String str : strings) { if (!str.isEmp...原创 2020-04-30 15:35:18 · 2232 阅读 · 0 评论 -
orElse与orElseGet的对比,使用的情景不同
这两个函数的字面区别相比大家都比较熟悉没有必要介绍,其他很多文档都介绍了。当返回值不存在的时候,两个函数却别不大。但是不存在的时候是有一定区别的。就是orElseGet方法不会执行,因为他使用的Supplier函数接口。既然orElseGet有这个有点是不是可以全部使用orElseGet替换orElse呢?不是的。当值是函数或者需要计算时建议使用orElseGet,当...原创 2020-04-28 15:56:19 · 2430 阅读 · 0 评论 -
Gradle 阿里源
repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public" }}https://maven.aliyun.com/mvn/searchhttps://maven.aliyun.com/mvn/view原创 2020-04-04 23:38:13 · 362 阅读 · 0 评论 -
Use Ctrl+J to complete any valid Live Template abbreviation if you don't remember it.
原创 2020-03-27 11:48:16 · 268 阅读 · 0 评论 -
map 和 flatMap 区别
map & flatMap这两个函数经常被使用。它们有如下区别:map把数组流中的每一个值,使用所提供的函数执行一遍,一一对应。得到元素个数相同的数组流。flatMapflat是扁平的意思。它把数组流中的每一个值,使用所提供的函数执行一遍,一一对应。得到元素相同的数组流。只不过,里面的元素也是一个子数组流。把这些子数组合并成一个数组以后,元素个数大概率会和原数组流的...转载 2020-03-26 14:16:12 · 1188 阅读 · 0 评论 -
Chapter2 Creating and Destroying Objects
原创 2020-03-22 12:08:15 · 198 阅读 · 0 评论 -
Builder 的应用
改造前当前正在开发工会宣战的一个系统,需要存储宣战记录。但是记录包括很多数据,开始使用构造方法传递参数。DeclareWarUnionInfo(CrossAllianceService crossAllianceService, long unionId, long acceptUnionId, long warTime, long dec...原创 2020-03-18 17:58:57 · 305 阅读 · 0 评论 -
Java 类加载机制详解
什么是 Java 类加载机制?Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器会读取这个 .class 文件,并转换成 java.lang.Class 的实例。有了该 Class 实例后,Java 虚拟机可以利用 newInstance 之类的方法创建其真正对象了。ClassLo...转载 2020-02-25 16:12:53 · 198 阅读 · 0 评论 -
java 打印调用堆栈的2种方法:
java 打印调用堆栈的2种方法: RuntimeException Thread.currentThread().getStackTrace() package ziegler.learn.debug;import java.util.stream.Stream;public class RunTest { void printTrackTest() ...原创 2020-02-24 21:12:08 · 5579 阅读 · 1 评论 -
Spring MVC 之 AbstractAnnotationConfigDispatcherServletInitializer剖析
Servlet3.0环境中,容器会在类路径中查找实现ServletContainerInitializer 接口的类,如果发现的话,就用它来配置Servlet容器。Spring提供了这个接口的实现类SpringServletContainerInitializer , 通过@HandlesTypes(WebApplicationInitializer.class)设置,这个类反过来会查找实现...原创 2019-12-31 15:10:50 · 2171 阅读 · 0 评论 -
Spring MVC 之 DispatcherServlet 和 ContextLoaderListener 处理流程解析。
DispatcherServlet的处理流程:AbstractDispatcherServletInitializer 的 onStartup调用 registerDispatcherServlet方法 调用 createServletApplicationContext 抽象方法返回WebApplicationContext 对象。 createServletApplication...原创 2019-12-31 14:39:25 · 625 阅读 · 0 评论 -
远程调用之RMI、Hessian、Burlap、Httpinvoker、WebService的比较
转载:https://www.cnblogs.com/maybo/p/5190012.html一、综述本文比较了RMI、Hessian、Burlap、Httpinvoker、WebService5这种通讯协议的在不同的数据结构和不同数据量时的传输性能。RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础。但它只能用于JAVA程序之间的通讯。Hessian和Burla...转载 2019-12-20 11:55:41 · 292 阅读 · 0 评论