JSR310新日期API(一)-时区与时间偏移量
前提最近刚好有新项目使用到JSR-310(JDK8)中引入的新日期API,打算做一下总结。本文编写基于JDK11,部分API可能是JDK9之后新增的。
地理知识补充主要补充一下一些地理知识:时区、UTC、GMT、CST、DST和ISO-8601的相关概念。
时区时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。造成时间上的混乱是由于世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差(这个偏差我们通常叫做时差)。
前边提到全球共分为24个时区(东、西各 ...
RabbitMQ扩展之交换器间的绑定
概要AMQP-0-9-1中提供了queue.bind方法用于绑定一个队列到一个交换器,然后发送消息的时候,数据流总是先通过交换器(source)最终到达目标队列中(destination)。RabbitMQ实现了扩展,为交换器提供了一个exchange.bind方法用于绑定一个交换器到另一个交换器。交换器之间的绑定和队列与交换器的绑定在语义上是相同的:单向的、使用路由键和多种交换器类型。这一点允许使用者创建更丰富的路由拓扑。exchange.bind方法中的source和destination反映了消息的流向:从源(source)交换器到目标(destination)交换器。
像queue.b ...
基于SpringBoot的Environment源码理解实现分散配置
前提org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性。Environment继承自接口PropertyResolver,而PropertyResolver提供了属性访问的相关方法。这篇文章从源码的角度分析Environment的存储容器和加载流程,然后基于源码的理解给出一个生产级别的扩展。
本文较长,请用一个舒服的姿势阅读。
Environment类体系
PropertyResolver:提供属性访问功能。
ConfigurablePropertyRes ...
CGLIB动态代理原理分析
前提前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理。
CGLIB动态代理原理分析我们经常说CGLIB的动态代理的底层通过被代理类生成代理子类实现的,那么下面我们就分析一下生成的子类到底是什么样的。开启CGLIB的debug模式,输出它生成的类到指定的目录:
public class DebuggingCglibDemo { private static final String METHOD_NAME = "sayHello"; publ ...
简述CGLIB常用API
CGLIB简介CGLIB,即Code Generation Library,是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(例如Spring)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib。
CGLIB的github简介:CGLIB - 字节码生成库,是用于生成和转换Java字节码的高级API。它被AOP、测试、数据访问框架用于生成动态代理对象和拦截 ...
Zookeeper客户端Curator使用详解
前提因为最近项目需要使用Zookeeper这个中间件,提前了解一下它的客户端Curator的使用。
简介Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
引子和趣闻:Zookeeper名字的由来是比较有趣的,下面的片段摘抄自《从PAXOS到ZOOKEEPE ...
深入分析Java反射(八)-优化反射调用性能
前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。
前一篇文章已经介绍了反射调用的底层原理,其实在实际中对大多数Java使用者来说更关系的是如何提升反射调用的性能,本文主要提供几个可行的方案。另外,由于方法调用时频率最高的反射操作,会着重介绍方法的反射调用优化。
方法一:选择合适的API选择合适的API主要是在获取反射相关元数据的时候尽量避免使用遍历的方法,例如:
获取Field实例:尽量避免频繁使用Class#getDeclar ...
深入分析Java反射(七)-简述反射调用的底层实现
前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。
本文主要介绍反射调用的底层实现,当然还没有能力分析JVM的实现,这里只分析到最终Native方法的调用点。底层会依赖到Unsafe类,可以的话可以看下笔者之前写的一篇文章《神奇的魔法类和双刃剑-Unsafe》。
反射调用的底层实现探究主要考虑下面的情况:
属性操作:java.lang.reflect.Field#set(Object obj, Object value)和java ...
深入分析Java反射(六)-反射调用异常处理
前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。
本文主要介绍一个使用反射一定会遇到的问题-反射调用异常处理。
反射调用异常处理反射调用出现异常的方法主要考虑下面的情况:
属性操作:java.lang.reflect.Field#set(Object obj, Object value)和java.lang.reflect.Field#get(Object obj)。
构造器调用:java.lang.reflect.Constr ...
神奇的魔法类和双刃剑-Unsafe
前提JDK9或者以后,sun.misc包的源码也可以上传到JDK类库中,可以直接导入IDE进行注释的阅读,这一点是比较好的改进。本文基于JDK11的源码阅读Unsafe类的注释,介绍一下这个类的使用方式。
Unsafe简介在JDK9之后,sun.misc.Unsafe被移动到jdk.unsupported模块中,同时在java.base模块克隆了一个jdk.internal.misc.Unsafe类,代替了JDK8以前的sun.misc.Unsafe的功能,jdk.internal包不开放给开发者调用。
Unsafe是用于在实质上扩展Java语言表达能力、便于在更高层(Java层)代码里实 ...