
Java
文章平均质量分 94
mghio
这个作者很懒,什么都没留下…
展开
-
抓包分析 TCP 握手和挥手
首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务。在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂。反复思考过后,觉得我自己还是偏工程型的人,要学习这些理论性的知识,最好的方式还是要通过实际案例来理解,这样才会具象深刻。本文通过Wireshark抓包来分析 TCP三次握手和四次挥手,如果你也对这些理论感觉似懂非懂,那么强烈建议你也结合抓包实践来强化理解这些理论性的知识。原创 2022-11-06 16:26:20 · 1095 阅读 · 0 评论 -
Spring 中 @EnableXXX 注解的套路
在 Spring 框架中有很多实用的功能,不需要写大量的配置代码,只需添加几个注解即可开启。 其中一个重要原因是那些 @EnableXXX 注解,这篇文章带你一起揭秘 @EnableXXX 注解。原创 2022-05-24 20:29:55 · 247 阅读 · 0 评论 -
Spring 中 @EnableXXX 注解的套路
前言在 Spring 框架中有很多实用的功能,不需要写大量的配置代码,只需添加几个注解即可开启。 其中一个重要原因是那些 @EnableXXX 注解,它可以让你通过在配置类加上简单的注解来快速地开启诸如事务管理(@EnableTransactionManagement)、Spring MVC(@EnableWebMvc)或定时任务(@EnableScheduling)等功能。这些看起来简单的注解语句提供了很多功能,但它们的内部机制从表面上看却不太明显。 一方面,对于使用者来说用这么少的代码获得这么多实用的原创 2022-05-22 18:50:06 · 455 阅读 · 0 评论 -
Java 内存模型
前言在并发编程中,当多个线程同时访问同一个共享的可变变量时,会产生不确定的结果,所以要编写线程安全的代码,其本质上是对这些可变的共享变量的访问操作进行管理。导致这种不确定结果的原因就是可见性、有序性和原子性问题,Java 为解决可见性和有序性问题引入了 Java 内存模型,使用互斥方案(其核心实现技术是锁)来解决原子性问题。这篇先来看看解决可见性、有序性问题的 Java 内存模型(JMM)。什么是 Java 内存模型Java 内存模型在维基百科上的定义如下:The Java memory mode原创 2021-08-22 15:10:46 · 196 阅读 · 0 评论 -
对象转换工具 MapStruct 介绍
前言在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO、XXXVO、XXXBO 等基于数据库对象派生出来的对象,当在不同层之间传输数据时,不可避免地经常需要将这些对象进行相互转换。此时一般处理两种处理方式:① 直接使用 Setter 和 Getter 方法转换、② 使用一些工具类进行转换(e.g. BeanUtil.copyProperties)。第一种方式如果对象属性比较多时,需要写很多的 Getter/Sette原创 2021-08-09 21:13:54 · 1603 阅读 · 1 评论 -
Java 异步编程的几种方式
前言异步编程是让程序并发运行的一种手段。它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失败异常的原因。使用异步编程可以大大提高我们程序的吞吐量,可以更好的面对更高的并发场景并更好的利用现有的系统资源,同时也会一定程度上减少用户的等待时间等。本文我们一起来看看在 Java 语言中使用异步编程有哪些方式。Thread 方式在 Java 语言中最简单使用异步编程的方式就是创建一个 Thread 来实原创 2021-08-01 19:23:35 · 762 阅读 · 0 评论 -
Java 并发之 Fork/Join 框架
什么是 Fork/Join 框架Fork/Join 框架是一种在 JDk 7 引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果的特殊任务。通过其命名也很容易看出框架主要分为 Fork 和 Join 两个阶段,第一阶段 Fork 是把一个大任务拆分为多个子任务并行的执行,第二阶段 Join 是合并这些子任务的所有执行结果,最后得到大任务的结果。这里不难发现其执行主要流程:首先判断一个任务是否足够小,如果任务足够小,则直接计算,否则,就拆分成几个更小的小任务原创 2021-07-25 21:49:18 · 377 阅读 · 0 评论 -
Spring 的循环依赖问题
什么是循环依赖什么是循环依赖呢?可以把它拆分成循环和依赖两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路;依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致。放到 Spring 中来看就一个或多个 Bean 实例之间存在直接或间接的依赖关系,构成循环调用,循环依赖可以分为直接循环依赖和间接循环依赖,直接循环依赖的简单依赖场景:Bean A 依赖于 Bean B,然后 Bean B 又反过来依赖于 Bean A(Bean A -> Bean B -> Bean A原创 2021-07-17 18:08:24 · 477 阅读 · 1 评论 -
一文让你彻底搞懂 Spring Cloud 整合 Feign 的原理!
前言在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式开放给开发者使用,在引入官方提供的 starter 后通常只需要添加一些注解即可使用相关功能(通常是 @EnableXXX)。下面就一起来看看 Spring Cloud 到底是如何整合 Feign 的。整合原理浅析在 Spring 中一切都是围绕 Bean 来展开的工作,而所有的 Bean 都是基于 Bea原创 2021-07-04 22:05:21 · 531 阅读 · 3 评论 -
聊聊 Feign 的实现原理
What is FeignFeign 是⼀个 HTTP 请求的轻量级客户端框架。通过 接口 + 注解的方式发起 HTTP 请求调用,面向接口编程,而不是像 Java 中通过封装 HTTP 请求报文的方式直接调用。服务消费方拿到服务提供方的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。让我们更加便捷和优雅的去调⽤基于 HTTP 的 API,被⼴泛应⽤在 Spring Cloud 的解决⽅案中。开源项目地址:Feign,官方描述如下:Feign is a Java to HTTP cli原创 2021-06-27 16:11:12 · 474 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 AOP(终结篇)
前言在 上篇 实现了 判断一个类的方式是符合配置的 pointcut 表达式、根据一个 Bean 的名称和方法名,获取 Method 对象、实现了 BeforeAdvice、AfterReturningAdvice 以及 AfterThrowingAdvice并按照指定次序调用 等功能,这篇再来看看剩下的 代理对象如何生成、根据 XML 配置文件生成 BeanDefintion以及如何将生成的代理对象放入到容器中 等功能,话不多说,下面进入主题。代理对象生成代理对象的生成策略和 Spring 框架一致原创 2021-06-13 20:53:41 · 214 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 AOP(下)
前言前面两篇 如何实现 AOP(上)、如何实现 AOP(中) 做了一些 AOP 的核心基础知识简要介绍,本文进入到了实战环节了,去实现一个基于 XML 配置的简易版 AOP,虽然是简易版的但是麻雀虽小五脏俱全,一些核心的功能都会实现,通过实现这个简易版的 AOP,相信你会对 AOP 有深入的理解,不止知其然,还能知其所以然。AOP 的顶层接口规范和底层依赖基础组件都是由一个叫 AOP Alliance 的组织制定的,我们经常听到的 AspectJ、ASM、CGLIB 就是其中被管理的一些项目,需要明确的一原创 2021-06-06 20:55:22 · 152 阅读 · 4 评论 -
如何实现一个简易版的 Spring - 如何实现 AOP(中)
前言在上篇 如何实现 AOP(上) 介绍了 AOP 技术出现的原因和一些重要的概念,在我们自己实现之前有必要先了解一下 AOP 底层到底是如何运作的,所以这篇再来看看 AOP 实现所依赖的一些核心基础技术。AOP 是使用动态代理和字节码生成技术来实现的,在运行期(注意:不是编译期!)为目标对象生成代理对象,然后将横切逻辑织入到生成的代理对象中,最后系统使用的是带有横切逻辑的代理对象,而不是被代理对象,由代理对象转发到被代理对象。代理模式动态代理的根源是设计模式中的代理模式,代理模式在 GoF 中的描述原创 2021-05-30 14:39:12 · 146 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 AOP(上)
前言本文是「如何实现一个简易版的 Spring 系列」的第五篇,在之前介绍了 Spring 中的核心技术之一 IoC,从这篇开始我们再来看看 Spring 的另一个重要的技术——AOP。用过 Spring 框架进行开发的朋友们相信或多或少应该接触过 AOP,用中文描述就是面向切面编程。学习一个新技术了解其产生的背景是至关重要的,在刚开始接触 AOP 时不知道你有没有想过这个问题,既然在面向对象的语言中已经有了 OOP 了,为什么还需要 AOP 呢?换个问法也就是说在 OOP 中有哪些场景其实处理得并不优雅原创 2021-05-23 10:45:28 · 218 阅读 · 3 评论 -
论基础理论知识的重要性
前言在计算机行业工作的人们,最大的感触就是这个行业里总是会出现很多的新东西,各种技术、框架等等,变化无处不在,有很大一部分人都比较焦虑。在一些论坛或者社区里面总是有人在问如何学习一门新技术?怎样才能跟上技术的潮流?我想说是,我们应该打牢基础,应对变化,以不变应万变。从变化中寻找不变的东西变化都是我们看到表面现象,本质的变化其实并没有多大。计算机发展的这几十年来,理论的层面变得不多,很多理论都是在几十年前就已经发现了的,只是在表现形式上变化比较大,夸张一点的甚至是一年一个样的都有。所以想要应对这种变.原创 2021-04-16 21:06:37 · 1974 阅读 · 1 评论 -
如何实现一个简易版的 Spring - 如何实现 @Autowired 注解
前言本文是 如何实现一个简易版的 Spring 系列第四篇,在 上篇 介绍了 @Component 注解的实现,这篇再来看看在使用 Spring 框架开发中常用的 @Autowired 注入要如何实现,大家用过 Spring 都知道,该注解可以用在字段、构造函数以及setter 方法上,限于篇幅原因我们主要讨论用在字段的方式实现,其它的使用方式大体思路是相同的,不同的只是解析和注入方式有所区别,话不多说,下面进入我们今天的正题—如何实现一个简易版的 Spring - 如何实现 @Autowired 注解。原创 2021-03-08 08:52:45 · 169 阅读 · 0 评论 -
这几个好用的 Google 搜索技巧,让你飞起!
搜索能力是被绝大多数人低估的一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力。其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要的东西,不会搜索的人用什么都不好使。下面介绍一些 Google 常用的搜索技巧以及搜索快捷方式,可以帮助你更快,更准确地找到结果。Google 是世界上功能最强大的搜索引擎,它已经改变了我们查找信息的方式。0. 使用准确的词组将您要搜索的关键字用引号引起来,Google 会进行精确的词组搜索。语法:"原创 2021-03-01 21:02:18 · 946 阅读 · 0 评论 -
如何实现 Spring 的 @Component 注解
mghio读完需要36分钟速读仅需 12 分钟 前言前面两篇文章(如何实现一个简易版的 Spring - 如何实现 Setter 注入、如何实现一个简易版的 Spring - 如何实现...原创 2021-02-14 19:30:00 · 1473 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 @Component 注解
前言前面两篇文章(如何实现一个简易版的 Spring - 如何实现 Setter 注入、如何实现一个简易版的 Spring - 如何实现 Constructor 注入)介绍的都是基于 XML 配置文件方式的实现,从 JDK 5 版本开始 Java 引入了注解支持,带来了极大的便利,Sprinng 也从 2.5 版本开始支持注解方式,使用注解方式我们只需加上相应的注解即可,不再需要去编写繁琐的 XML 配置文件,深受广大 Java 编程人员的喜爱。接下来一起看看如何实现 Spring 框架中最常用的两个注解原创 2021-02-14 16:28:46 · 537 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 Constructor 注入
前言本文是「如何实现一个简易版的 Spring」系列的第二篇,在 第一篇 介绍了如何实现一个基于 XML 的简单 Setter 注入,这篇来看看要如何去实现一个简单的 Constructor 注入功能,实现步骤和 Setter 注入是一样的“套路”,先设计一个数据结构去解析表达 XML 配置文件里的信息,然后再使用这些解析好的数据结构做一些事情,比如这里的 Constructor 注入。话不多说,下面我们直接进入正题。数据结构设计使用 Constructor 注入方式的 XML 的一种配置如下所示:原创 2021-01-17 15:34:43 · 308 阅读 · 0 评论 -
如何实现一个简易版的 Spring - 如何实现 Setter 注入
前言之前在 上篇 提到过会实现一个简易版的 IoC 和 AOP,今天它终于来了。。。相信对于使用 Java 开发语言的朋友们都使用过或者听说过 Spring 这个开发框架,绝大部分的企业级开发中都离不开它,通过 官网 可以了解到其生态非常庞大,针对不同方面的开发提供了一些解决方案,可以说 Spring 框架的诞生是对 Java 开发人员的一大福利,自 2004 年发布以来,Spring 为了解决一些企业开发中的痛点先后引入了很多的特性和功能,其中最重要的就是我们经常听到的 IoC 和 AOP 特性,由于涉原创 2020-11-29 16:16:11 · 344 阅读 · 0 评论 -
Spring 是如何造出一个 Bean 的
前言使用 Java 作为第一开发语言的朋友们,相信大家或多或少的都使用过 Spring 这个开发框架,可以说 Spring 框架真是我们 Java 程序员的春天,在 Spring 中 Bean 是其中最重要的概念之一,是学习其它高级知识的基础,Bean 说白了其实就是一个被 Spring 框架管理的对象,今天我们来看看 Bean 在 Spring 中是如何被造出来的。1. Bean 要如何定义假如你有如下这样的一个 Programmer 类,这个程序员类有三个属性: 姓名(name)、年龄(age)、原创 2020-10-08 16:11:16 · 396 阅读 · 0 评论 -
从 CPU 缓存看缓存的套路
一、前言不同存储技术的访问时间差异很大,从 计算机层次结构 可知,通常情况下,从高层往底层走,存储设备变得更慢、更便宜同时体积也会更大,CPU 和内存之间的速度存在着巨大的差异,此时就会想到计算机科学界中一句著名的话:计算机科学的任何一个问题,都可以通过增加一个中间层来解决。二、引入缓存层为了解决速度不匹配问题,可以通过引入一个缓存中间层来解决问题,但是也会引入一些新的问题。现代计算机系统中,从硬件到操作系统、再到一些应用程序,绝大部分的设计都用到了著名的局部性原理,局部性通常有如下两种不同的形式:原创 2020-09-30 09:15:43 · 180 阅读 · 0 评论 -
Java 集合类 List 的那些坑
现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现,像 Java 编程语言的集合框架中就提供了各种实现,集合类包含 Map 和 Collection 两个大类,其中 Collection 下面的 List 列表是我们经常使用的集合类之一,很多的业务代码都离不开它,今天就来看看 List 列表的一些坑。第一个坑:Arrays.asList 方法返回的 List 不支持增加、删除操作例如我们执行以下代码:List<String> strings = Arrays.asList("m",原创 2020-08-23 13:28:02 · 265 阅读 · 0 评论 -
RabbitMQ 基础概念进阶
上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念。一、消息生产者发送的消息不可达时如何处理RabbitMQ 提供了消息在传递过程中无法发送到一个队列(比如根据自己的类型和路由键没有找到匹配的队列)时将消息回传给消息发送方的功能,使用 RabbitMQ 的客户端提供 channel.basicPublish 方法的两个参数 mandatory 和 immediate (RabbitMQ 3.0 以下版本),除此之外还提供了一个原创 2020-08-09 18:37:46 · 242 阅读 · 0 评论 -
RabbitMQ 入门之基础概念
什么是消息队列(MQ)消息是在不同应用间传递的数据。这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象。消息队列(Message Queue)简单来说就是一种应用程序间的通讯方式,消息发送后立即返回,然后由消息系统保证消息的可靠性传输,消息生产者只需要把消息发到 MQ 中就可以了,不需要关心消息的消费,同样,消息消费者只管从 MQ 中拉取消息而不管是谁生产的消息,通过这样的一个“互相不知道对象存在”模式,将消息的生产者和消息的消费者解耦了。什么场景下考虑使用消息队列从上面可以原创 2020-07-18 18:21:35 · 236 阅读 · 0 评论 -
Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
前言在 Java 中通过 锁 来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关键字并不需要去关心锁的获取和释放过程,但是在提供方便的同时也意味着其灵活性的下降。例如,有这样的一个场景,先获取锁 A,然后再获取锁 B,当锁 B 获取到之后,释放锁 A 同时获取锁 C,当获取锁 C 后,再释放锁 B 同时获取锁 D,依次类推,像这种比较复杂的场景,使用 synchronized 关键字就原创 2020-06-11 21:58:14 · 449 阅读 · 0 评论 -
一文让你快速上手 Mockito 单元测试框架
前言在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用。为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多其它功能。使用 Java 语言的朋友应该用过或者听过 Junit 就是用来做单元测试的,那么为什么我们还需要 Mockito 测试框架呢?想象一下这样的一个常见的场景,当前要测试的类依赖于其它一些类对象时,如果用 Junit 来进行单元测试的话,我们就必须手动创建出这些依赖的对象,这其实是个比较麻烦的工作,此时原创 2020-05-31 09:13:52 · 626 阅读 · 0 评论 -
如何在一台计算机上安装多个 JDK 版本
前言对于使用 Java 语言开发的朋友可能会遇到这种情况,有时想学习和探索 Java 的最新版本提供的一些新特性,比如 Java 11,但你无法将其安装在自己的计算机上,因为你的团队正在使用比这个旧的版本(我们目前用的 Java 8),你并不想影响目前的项目。或者你目前是在维护和开发多个项目,而这些不同的项目使用的 JDK 版本不一样,比如那些维护的老项目使用的是 JDK 8,而新项目你打算使用比较新的版本 JDK 11,以上这些情况都需要在计算机上安装多个 JDK,并且应该能够在多个版本之间方便快速的切原创 2020-05-17 17:43:58 · 760 阅读 · 1 评论 -
看了你就懂的同步与异步、阻塞与非阻塞
前言在网上看到过很多讲有关同步与异步、阻塞与非阻塞的文章,但是很多都是抛出一堆相关定义,看了之后还是云里雾里的,对这几个概念还是不能很好的去区分它们。本文通过通俗易懂的语言和相关例子让你深入理解其本质。同步与异步首先我们要明确的是,同步和异步都是针对两个或者两个以上的事物来说的。比如当我们在网上购物看中一件物品,然后去浏览该商品详情的时候,首先页面会先发送一个请求,后台服务器查询对应商品的相...原创 2020-04-26 22:14:44 · 258 阅读 · 0 评论 -
如何在亿级数据中判断一个元素是否存在?
前言在日常工作中,经常要判断一个元素是否在一个集合中。假设你要向浏览器添加一项功能,该功能可以通知用户输入的网址是否是恶意网址,此时你手上有大约 1000 万个恶意 URL 的数据集,你该如何实现该功能。按我之前的思维,要判断一个元素在不在当前的数据集中,首先想到的就是使用 hash table,通过哈希函数运行所有的恶意网址以获取其哈希值,然后创建出一个哈希表(数组)。这个方案有个明显的缺点,...原创 2020-04-19 21:38:27 · 536 阅读 · 1 评论 -
字符串操作 — Google Guava
前言Java 里字符串表示字符的不可变序列,创建后就不能更改。在我们日常的工作中,字符串的使用非常频繁,熟练的对其操作可以极大的提升我们的工作效率,今天要介绍的主角是 Google 开源的一个核心 Java 库 Guava,它提供了集合类型、不可变的集合、并发、I / O、缓存、字符串等许多实用功能。在本文中,我们将学习使用 Guava 中的 Strings 和 Splitter 字符串操作工具...原创 2020-04-12 19:51:58 · 501 阅读 · 0 评论 -
如何编写优雅的异步代码 — CompletableFuture
前言在我们的意识里,同步执行的程序都比较符合人们的思维方式,而异步的东西通常都不好处理。在异步计算的情况下,以回调表示的动作往往会分散在代码中,也可能相互嵌套在内部,如果需要处理其中一个步骤中可能发生的错误时,情况变得更加糟糕。Java 8 引入了很多的新特性,其中就包含了 CompletableFuture 类的引入,这让我们编写清晰可读的异步代码变得更加容易,该类功能非常强大,包含了超过 5...原创 2020-04-06 20:59:52 · 392 阅读 · 0 评论 -
代码中的坏味道
前言在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味(“坏味道”),这个时候我们就应该把它扔掉。同样,代码也有“坏味道”,当然确定什么是和不是代码“坏味道”是主观的,它会随语言、开发人员和开发方法的不同而不同。在工作当中,很多时候都是在维护之前的项目和在此基础上增加一些新功能,为了能让项目代码易于理解和维护,要时刻注意代码中的“坏味道”,当发现代码如果有坏味道了,要及时去重构它使其变成...原创 2020-03-29 19:31:05 · 566 阅读 · 0 评论 -
Java 垃圾收集技术
前言在计算机科学中,垃圾收回(GC: garbage collection)是内存自动管理的一种方式,它并不是同 Java 语言一起诞生的,实际上,早在 1959 年为了简化 Lisp 语言的手动内存管理,该语言的作者就开始使用了内存自动管理技术。 垃圾收集和手动内存管理刚好相反,后者需要编程人员自己去指定需要释放的对象然后将内存归还给操作系统,而前者不需要关心给对象分配的内存回收问题。Java...原创 2020-03-21 15:20:31 · 176 阅读 · 0 评论 -
服务发现组件之 — Eureka
前言现在流行的微服务体系结构正在改变我们构建应用程序的方式,从单一的单体服务转变为将它们分解为越来越小的可单独部署的服务(称为微服务),共同构成了我们的应用程序。当进行一个业务时不可避免就会存在多个服务之间调用,假如一个服务 A 要访问在另一台服务器部署的服务 B,那么前提是服务 A 要知道服务 B 所在机器的 IP 地址和服务对应的端口,最简单的方式就是让服务 A 自己去维护一份服务 B 的配...原创 2020-03-15 15:59:55 · 217 阅读 · 0 评论 -
2020 年 JVM 生态报告解读
前言做过 Java 开发的同学都知道,JVM(Java 虚拟机) 是 Java 实现的基础,虽然在平时工作中真正运用到的时候可能并不多,但是一个程序员想要上升到高级层次,那就必须知道 Java 到底是怎么运行的,这就有必要去学习了解 JVM 的相关知识了。学习 JVM 可以能更深入的理解 Java 这门语言,可以清楚知道Java程序是如何执行的以及为未来排查线上问题打下坚实的基础。接下来我们看看...原创 2020-03-05 09:23:56 · 579 阅读 · 2 评论 -
分布式系统之 — CAP 定理
前言在互联网时代,我们的运用都是分布式系统,部署在 N 台机器上。说到分布式系统我们就不得不说分布式系统的祖先——集中式系统。它和分布式系统是两个完全相反的两个概念,集中式系统就是把所有的程序和功能都放到一台主机上,从而对外提供服务。集中式系统的优点就是容易理解、维护方便,它的的弊端也很明显,如果这个主机出故障了那么整个系统就崩溃了。著名投资家巴菲特有个关于投资的名言:不要把鸡蛋放在一个篮子...原创 2020-02-29 16:34:04 · 370 阅读 · 0 评论 -
Java 反射机制(二)
前言在上篇 Java 反射机制(一) 介绍了一些 Java 反射相关的常用 API ,在知道了如何去使用反射之后,作为一个合格的工程师,下一步肯定是要去了解它的如何实现的,我们今天就来看看在 JDK 源码中是如何去实现反射的(PS:以下源码分析基于 JDK1.8)。Field 类 set 方法的实现Field 类的 set 方法是在运行时用来动态修改一个类的属性的值,进入到 Field 类的...原创 2020-01-05 16:32:08 · 374 阅读 · 0 评论 -
Java 反射机制(一)
前言在 Java 中有两种方式可以让我们在运行时识别对象和类的信息。一种是 RTTI(运行时类型识别:Run-Time Type Identification),它假定了我们在编译时已经知道了所有的类型;另一种是我们本文要说的反射机制,它允许我们在运行时获取和使用类的信息。无论是 RTTI 还是反射,其本质都是一样的,都是去动态的获取类的信息。它们唯一不同的是,RTTI 在编译时期知道要解析的类...原创 2019-12-29 22:37:40 · 205 阅读 · 0 评论