Java基础
文章平均质量分 70
黑色核桃
这个作者很懒,什么都没留下…
展开
-
JVM反射的实现
实现方式有两种不同的实现方式,一种是本地实现,一种是动态实现。JVM开始运行之后,方法的代码和入口地址都能获取到,想要通过反射调用方法,无非就是找到方法地址,然后将参数传递进去执行。本地实现就是使用native方法直接调用方法。但是这种方法涉及到java代码调用c++代码,单次调用性能较差。动态实现是指通过字节码工具生成一个中间类,这个中间类直接调用目标方法,因此单次调用性能跟直接调用基本没有区别。但是生成动态类,以及动态类字节码的解释执行在首次执行是耗时很长。所以jvm对于调用次数很少的方法仍然原创 2021-06-09 15:22:11 · 164 阅读 · 0 评论 -
java如何处理异常
异常的继承关系所有异常都是继承自Throwable类及其子类,Throwable类有两个主要的子类,一个是Error一个是Exception,语义上来说Error比较严重,表示当前程序执行不下去也无法恢复。Exception下有一个子类叫RuntimeException,RuntimeException和Error是非检查异常,即不需要显示的处理和接收的异常,其他异常则必须进行显示的try-catch处理或重新throw出去。异常的处理模块try模块:需要监控的代码块,其中若产生了异常则交给catch原创 2021-06-09 15:19:56 · 163 阅读 · 0 评论 -
java方法调用及句柄
java方法调用invokeStatic:调用静态方法invokeSpecial: 调用非静态私有方法、super方法、构造函数invokeVirtual:调用非静态公开方法invokeInterface:调用接口方法invokeDynamic:动态方法调用前两个是静态绑定,运行时能知道具体的方法地址;后三个是动态绑定,运行时需要根据实际调用对象来寻找正确的方法,以方法表的方式实现。final标识的方法是不允许重写的,因此也可以静态绑定。方法表分为虚方法表和接口方法表,分别对应invokeVi原创 2021-06-09 15:17:53 · 424 阅读 · 0 评论 -
java垃圾回收及对象创建
安全点、安全区域JVM垃圾回收线程工作的时候往往需要stop the world(stw),即停止正在运行中用户线程。因为JVM垃圾回收是基于可达性分析,可达性分析第一步首先就是要找到能标识对象仍可到达的GC Root,包括(方法栈中的局部变量,方法区的静态变量、常量池中的引用、本地方法中的引用等),如果用户线程一直在运行的话,GC root集合可能不停在变化,因此必须使得用户线程能够暂时停止改变GC root集合。为了实现这个目的,JVM在启动垃圾回收之后会通知所有的用户线程进去安全点或安全区域。如果原创 2021-06-09 15:11:43 · 153 阅读 · 0 评论 -
从缓存失效谈起
缓存失效缓存雪崩大量缓存key失效或者缓存实例宕机导致的大批量数据在缓存中无法查到,进而请求数据库,造成数据库压力过大的情况。应对这种情况,对于前者,在设置key的过期时间的时候就应该避免大量key过期时间相同,可以在过期时间上添加一个随机时间范围,避免短时间内大量数据被删除。对于后者,缓存实例可以采用集群部署,使用redis的主从同步方案,这样即使主库挂掉,也会迅速选择一个从库作为主库提供服务。同时缓存雪崩问题对缓存服务进行熔断、降级或限流,避免整个应用挂掉。缓存击穿少量访问量巨大的热点key失原创 2021-03-29 16:26:44 · 82 阅读 · 0 评论 -
Mock代理对象失效问题分析
Mockito 简介Mockito是一种常用的java单测框架,主要功能就是用来模拟接口的实现,对于测试环境无法执行的方法可以通过mock来执行我们定义好的逻辑。通常代码写法如下public class AimServiceTest { // 将mock对象注入到目标对象中 @Resource @InjectMocks private AimService aimService; // 生成mock对象 @Mock private NameS原创 2020-11-03 11:05:43 · 15235 阅读 · 3 评论 -
Mockito when函数实现方式
平时写单测时,对于一些有限制或因当前环境无法访问的接口时,需要用到Mock来为目标接口添加自定义的实现,使其表现出我们希望表现的逻辑,从而不影响单元测试的实现。Mockito是常用的一个类库,使用也比较简单。使用分为注解的方式和直接创建对象的方式。注解的方式// 被注入的目标对象@InjectMocksprivate AimService aimService;// 创建一个MockedService的一个mock对象@Mockprivate MockedService mockedSer原创 2020-11-03 11:04:38 · 13534 阅读 · 0 评论 -
cglib 动态代理原理详解
cglib 动态代理详解我们都知道jdk的动态代理内部调用切面无效的问题,而cglib则不会出现这种情况,这是为什么?cglib就一定不会出现内部调用切面无效的问题吗?cglib针对每一个类只创建了一个代理类吗?为什么cglib的效率要比jdk的动态代理低呢?首先我们看一下通常我们是如何使用cglib增强一个类的public class Main { static class Test{ public void test(){ System.out.pr原创 2020-11-03 11:01:42 · 1066 阅读 · 2 评论 -
java 类增强机制
前言对类的增强有多少种方式?我们首先想一下一个类的生命周期,从编码到程序运行结束:对类的增强,目的是为了在使用的时候能够在类原有的行为上进行增强,所以编码一直到使用中的几乎每个环节都可以对类进行增强,主要有以下几种方式:静态代理编译期织入:aspectJ加载时织入:1. 自定义classLoader;有容器能力;2. instrumention 动态attach运行时织入:动态代理1. 静态代理静态代理是最简单也是最容易理解的一种方式,只需要在编码的时候创建手动创建代理类调用即可,缺原创 2020-11-03 11:00:03 · 1859 阅读 · 1 评论 -
JAVA泛型一
1. Java泛型的实现方式Java中实现泛型是从Java5开始的,由于历史遗留问题,即为了兼容低版本未用泛型实现的类库,Java采用了擦除的方式实现泛型,泛型代码在运行时会被擦除到他的边界范围。这样一来,在泛型代码内部,就无法获得有关泛型参数的类型信息。package suzumiya;import java.util.Arrays;public class Template { publi原创 2015-12-19 22:17:56 · 321 阅读 · 0 评论