lombok的SneakyThrows究竟还原成什么代码它的用法

Posted 石头StoneWang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lombok的SneakyThrows究竟还原成什么代码它的用法相关的知识,希望对你有一定的参考价值。

背景

@SneakyThrows 这个 lombok 的注解背后生成的代码是什么样的?

这个注解可以放在方法上(含静态)或构造方法上

作用:其实就是用 try-catch 将方法的代码包起来。用 Throwable 接收可以接住一切

1、可用于:构造方法、普通方法、静态方法。不可放在类里。

2、它是使用 Throwable 作为 catch 的参数 (而不是Exception),所以不用担心有catch不到的

3、并不是像他的名字 “sneaky” 一样偷偷地catch住异常并吞掉,还是会抛出来的,放心。

4、它有点奇怪,用不了 IDEA 的 refactor 得到 delombok 结果 (见附录)

附录

1、这里列出了使用 @SneakyThrows其实际的源码是什么

package com.wyf.test.junittestcoverage.main;

import lombok.SneakyThrows;

import java.io.FileInputStream;

public class Test 
    // 运行时异常的情况加上这个
    @SneakyThrows
    public Test() 
        int i = 7 / 0;
    

    @SneakyThrows
    public Test(int i) 
        FileInputStream fis = new FileInputStream("/在构造方法里写这个/");
    

    // 运行时异常的情况加上这个
    @SneakyThrows
    public void testRuntimeException() 
        int i = 8 / 0;
    

    // 已检查异常
    @SneakyThrows
    public void testCheckedException() 
        FileInputStream fis = new FileInputStream("/在普通方法里写的这个方法/");
    


    // 运行时异常的情况加上这个
    @SneakyThrows
    public static void testRuntimeException2() 
        int i = 9 / 0;
    

    // 已检查异常
    @SneakyThrows
    public static void testCheckedException2() 
        FileInputStream fis = new FileInputStream("/在静态方法里写的这个方法/");
    

还原后得到:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.wyf.test.junittestcoverage.main;

import java.io.FileInputStream;

public class Test 
    public Test() 
        try 
            int var1 = 7 / 0;
         catch (Throwable var2) 
            throw var2;
        
    

    public Test(int i) 
        try 
            new FileInputStream("/在构造方法里写这个/");
         catch (Throwable var3) 
            throw var3;
        
    

    public void testRuntimeException() 
        try 
            int var1 = 8 / 0;
         catch (Throwable var2) 
            throw var2;
        
    

    public void testCheckedException() 
        try 
            new FileInputStream("/在普通方法里写的这个方法/");
         catch (Throwable var2) 
            throw var2;
        
    

    public static void testRuntimeException2() 
        try 
            int var0 = 9 / 0;
         catch (Throwable var1) 
            throw var1;
        
    

    public static void testCheckedException2() 
        try 
            new FileInputStream("/在静态方法里写的这个方法/");
         catch (Throwable var1) 
            throw var1;
        
    


2、如下,单使用 @SneakyThrows bing

即使能 Delombok,但是,@SneakyThrows 却还是不能,如下图

以上是关于lombok的SneakyThrows究竟还原成什么代码它的用法的主要内容,如果未能解决你的问题,请参考以下文章

Lombok注解:@SneakyThrows的具体介绍与使用

@Sneaky Throws 在龙目岛的应用

Spring boot Lombok

Spring boot Lombok

@SneakyThrows注解

善用Intellij插件可大幅提升我们的效率