Lombok
注解之@SneakyThrows
作用
读法
[ˈsniːki] [θroʊz]
悄悄的 抛出
顾名思义,它能够自动偷摸的为咱们的代码生成一个try…catch块,并把异常向上抛出来。
使用
@SneakyThrows的使用范围: 只能作用在方法和构造函数之上。从源码就可以看出。
SneakyThrows注解的原理主要涉及到Java的注解处理器和字节码操作。 Lombok通过自定义的注解处理器在编译时扫描源代码,并对带有@SneakyThrows注解的方法进行处理。处理的内容包括移除方法签名中的throws子句,并在方法体内部插入相应的字节码来包装和抛出异常。具体来说,Lombok生成的新方法与原方法具有相同的方法签名,但方法体内部会捕获所有可能抛出的受检查异常,将这些异常包装为一个新的未受检查异常(通常是RuntimeException或其子类),然后抛出。这样,即使在方法签名中没有声明要抛出的异常,也能在运行时抛出任何类型的异常,从而绕过了Java类型系统对受检查异常的限制。
从实现细节上看,sneakyThrow方法利用泛型将传入的Throwable强制转换为RuntimeException。尽管这样做在源码中看起来像是将异常强制转换为RuntimeException,但实际上JVM并不关心泛型类型,泛型信息在编译成字节码时已经丢失。这种做法“骗过”了javac编译器,使得在运行时可以抛出任何类型的异常,而不需要在方法签名中声明它们。
总的来说,sneakyThrow注解通过修改字节码和利用Java类型擦除的特性,使得开发者可以在不违反Java语言规范的情况下,灵活地处理异常,提高了代码的可读性和简洁性。