常见特性源码
常见特性源码与实现
槑!
这个作者很懒,什么都没留下…
展开
-
SPI机制源码解析
概念 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。 当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。使用:创建源码:获取源码:时序图:核心类UrlClassPa原创 2020-09-14 00:20:10 · 301 阅读 · 0 评论 -
函数式编程与Lamda底层
概念:Java一直是面向对象的语言,一切皆对象,如果想要调用一个函数,函数必须属于一个类或对象,然后在使用类或对象进行调用。但是在其它的编程语言中,如js,c++,我们可以直接写一个函数,然后在需要的时候进行调用,即可以说是面向对象编程,也可以说是函数式编程。从功能上来看,面向对象编程没什么不好的地方,但是从开发的角度来看,面向对象编程会多写很多可能是重复的代码行。比如创建一个Runnable的匿名类的时候:Runnable runnable = new Runnable() { @Overr原创 2020-09-14 00:19:50 · 179 阅读 · 0 评论 -
Stream并行流源码解析
承接我的上一篇Stream源码博客并行流并行流调试代码截图:并行流源码核心类图(可以看出Fork-Join)和串行开始有区别的地方去重:排序:小结:并行流对于有状态中间操作,会先设置其CombineFlag然后遍历每个流,如果是有状态的,则调用opEvaluateParallelLazy() 返回该有状态操作执行后的流(因为java doc中说到有状态的操作,没法同时和无状态操作一起并行进行)ForkJoin进行任务拆分执行,其实原创 2020-09-13 15:16:24 · 365 阅读 · 0 评论 -
Stream执行流程源码解析
Stream使用Stream中的操作可以分为两大类:中间操作与结束操作,中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。注意事项不要使用基本类型的数组获取流,因为得到的流还是数组流的执行顺序是一个元素会把流执行到底,并不是一个环节全部收集后再一起执行下一环节核心类图上面截图代码执行源码:总结:原创 2020-09-13 15:16:02 · 844 阅读 · 1 评论 -
注解底层源码解析
注解元注解@Target:注解的作用目标@Retention:注解的生命周期RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件RetentionPolicy.RUNTIME:永久保存,可以反射获取@Documented:注解是否应当被包含在 JavaDoc 文档中@Inherited:是否允许子类继承该注解内置三大注解@Override(Retenti原创 2020-09-13 15:15:02 · 278 阅读 · 0 评论 -
反射相关问题与源码解析
反射可以JVM运行时动态的加载类,还可以调用类的方法或者修改其属性。反射原理Class.forName()时序图源码clazz.getDeclaredMethod()时序图Class反射的元数据对象:源码method.invoke()时序图源码:比较GenerateMethodAccessorImpl对比该方法调用15次前,每次都是jvm本地方法调用。15次后,说明该方法经常使用,专门用a原创 2020-09-13 15:14:26 · 450 阅读 · 0 评论 -
序列化原理及技术实现
序列化理解序列化并不是说要把对象或者消息直接编码为二进制串,而是转化为本地某一种可以持久化或者传输的结构。编码为二进制串是网络七层模型中第六层表现层完成(通过获得序列化后文件的输入流,然后进行编码即可)。Java API相关Serializable 接口是一个标记接口,不用实现任何方法。一旦实现了此接口,该类的对象就是可序列化的。Serializable接口的反序列化并不会调用构造方法。对象是由JVM自己生成的对象,不通过构造方法生成。因此,它存在一定的安全隐患。一个精心构造的byte[]数组原创 2020-09-13 15:13:51 · 922 阅读 · 1 评论 -
final套餐及常见问题
final相关区别final修饰符(关键字)被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。被final声明的方法也同样只能使用,即不能方法重写。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块原创 2020-09-13 15:13:21 · 192 阅读 · 0 评论 -
异常设计原则与继承体系
异常异常体系Error与ExceptionError是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath、NoClassDefFoundError等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常,使程序继续正常运行。Exception运行时异常运行时异常都是RuntimeException类及其子类异常,如NullPoint原创 2020-09-13 15:12:49 · 324 阅读 · 0 评论 -
Object类与相关实现
Object类基本方法1、clone方法保护方法,实现对象的浅复制即把每个属性的原封不动复制过来,官方文档说"字段的内容本身不会被克隆", 即如果某个属性是对象,只会复制其引用,而不会复制其值还说"如果一个类仅包含基本字段或对不可变对象的引用,则通常情况是不需要super.clone 修改对象返回的字段",所以要实现深拷贝就要重写clone)只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。2、getClass方法fina原创 2020-09-13 15:12:12 · 148 阅读 · 0 评论 -
String常见问题及编译后实现
String底层内部结构public final class String implements Serializable,Comparable<String>,CharSequence { // 用于存储字符串的值 private final char value[] // 缓字符串的hash code private int hash;}值类使用final修适的原因安全,不会再有自类进行修改,从而导致出现安全问题高效原创 2020-09-13 15:11:34 · 367 阅读 · 0 评论 -
基本类型及包装类源码解析
基本与包装类基本类型有默认值,而包装类型初始为null所有的POJO类必须使用包装类型,在rpc方法中定义参数和返回值的类型用包装类,因为默认值不代表空值,比如0不代表该属性为空泛型调用函数必须用包装类,因为其参数类型都是Object。但是反射调用方法,其方法参数可以为基本类型,在invoke的java doc中说明了原始类型会和引用类型自动转换。在本地变量推荐使用基本类型。什么时候该用包装类,什么时候用基本类型,看基本的业务来定:这个字段允不允许null值或者参数为Object,则必然要用封装原创 2020-09-13 15:10:27 · 1388 阅读 · 0 评论