likes
comments
collection
share

听说4月Java基础应该刷这些(步三)

作者站长头像
站长
· 阅读数 10

做一个情绪稳定的人,清醒、识趣、克制。

hi,筒子们,不知道你们每天上班的心情是怎么样的?分享下我自己的现状想法吧,实际你目前所处的状况,
无论在任何一个地方都会经历,为了更好的应对突发状况,那么最好还是我们自己进行改变,努力提升自己,
不是有那么一句毒鸡汤吗?要努力做自己,哪怕错了,也没有什么可后悔的(出自Fmbah ^^!)

JAVA中你必须知道的内容

讲讲CGLIB动态代理呗?

步二中我有描述动态代理中,JDK动态代理是什么样子,那接下来我继续讲下CGLIB是个什么东西?
实际CGLIB是一个开源库,它主打修改字节码文件,并使其在JVM运行当中生效,这里我也放下[CGLIB官网](https://github.com/cglib/cglib/wiki/How-To),
大家有空可以去看下,接下来还是我画一个UML类图,方便大家理解

听说4月Java基础应该刷这些(步三) 听说4月Java基础应该刷这些(步三)

JDK动态代理必须指定被代理类是一个接口,CGLIB动态代理则不需要强制被代理类的类型是一个接口,因为它是生成了一个子类来实现方法增强的,这也就带来了一个问题,被代理类不能是final修饰的~

BigDecimal的坑你遇到几个?

筒子们,使用BigDecimal类的时候真的要小心啊,下面的两种坑点,我是都有被坑到过~
float f0 = 1.1f;  
float f1 = 1.2f;  
// 坑点1:构造方法  
BigDecimal b0 = new BigDecimal(f0);  
BigDecimal b1 = new BigDecimal(f1);  
// 期望为true,实际为false  
System.out.println(b1.subtract(b0).compareTo(new BigDecimal(String.valueOf(0.1f))) == 0);  
  
// 坑点1解决方案  
BigDecimal b0Copy = new BigDecimal(String.valueOf(f0));  
BigDecimal b1Copy = new BigDecimal(String.valueOf(f1));  
// 期望为true,实际为true  
System.out.println(b1Copy.subtract(b0Copy).compareTo(new BigDecimal(String.valueOf(0.1f))) == 0);  
  
  
// 坑点2:比较方式  
System.out.println(new BigDecimal("2.0").equals(new BigDecimal("2.000")));  
// 坑点2解决方案  
System.out.println(new BigDecimal("2.0").compareTo(new BigDecimal("2.000")) == 0);

UnSafe是否有了解过?

这里真的比较难,工作年限少的,专业不对口的大概率都不清楚UnSafe是用来做什么的...
从工作中实际应用场景上来讲,UnSafe也实际真的比较少使用,但是我们不得不去了解下,
毕竟当某一天,我们也开窍了,顺着源码一路找下去发现了这个奇葩,总的知道是个啥乖乖吧~

废话不多说,UnSafe提供了类C/C++的功能,可以直接访问系统资源,提供了管理系统资源的能力,
这些方法使得Java的运行效率/操作底层资源的灵活性得到了很大的改善;但是这些操作同样也给Java
带来了一些负面影响,过度使用可能会产生不可预估的效果,将Java这种安全的语言变得不再安全~

**如何获取UnSafe对象**
1. 可以通过反射的方式
2. 可以将获取UnSafe对象的类的路径追加到BootStrap加载器中

**UnSafe支持的方法**
1. 操作内存
2. 内存屏障
3. 对象操作
4. 数据操作
5. CAS操作
6. 线程调度
7. Class操作
8. 系统资源

实际上边的内容还有很多,我也不去摘抄了,具体可以参考下:https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html

JavaSPI了解过吗,简单讲讲呗

SPI 即Service Provider Interface:服务提供者接口;它约定了一个规范,让实现者按照规范完善对应的能力;
1. 需要创建该路径下resources/META-INF/services/SPI的全路径类名文件,然后在文件中填写实现类,多个以换行结束
2. 检索META-INF/services目录下的文件,并根据文件名称获取到SPI接口
3. 通过InputStream获取文件中的实现类,并且判定与2中是否是一致的类型,如果是就反射获取到实现类对象
4. 将3中创建的实现类放入到Providers缓存列表中,后续使用时从缓存中获取对象使用
相信从上边的步骤中,你可以感受到的是,好像甲方负责定义规则,乙方负责自己实现具体内容,然后甲方在某些场景调用的时候,会策略的调用乙方的具体实现

步三小结

难度慢慢上来了大家加油

转载自:https://juejin.cn/post/7226357340060532797
评论
请登录