map数据封装到javaBean:
注意:要map中的数据封装到JavaBean中去,需要map中的key与JavaBean里面的私有化的属性要相匹配。

import lombok.Data;
import lombok.SneakyThrows;
import org.apache.commons.beanutils.BeanUtils;
import java.util.HashMap;
import java.util.Map;

public class Test {
    @Data
    public static class Student {
        private String name;
        private String id;
        private int age;
        private String sex;
        private String a;
    }
    @SneakyThrows
    public static void main(String[] args)  {
        //创建对象
        Student s = new Student();
        //map的数据拷贝到对象中去
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("id","123");
        map.put("name","laomao");
        map.put("sex","男");
        map.put("b","1@1.1");
        BeanUtils.populate(s, map);
        System.out.println(s);
    }
}

输出结果:Test.Student(name=laomao, id=123, age=0, sex=男, a=null)

因为@Data注解中包含了@Getter、@Setter、@ToString等很多注解的功能,所以可以在类上使用一个@Data注解即可;
如果只需要使用setter方法、getter方法、toString方法,可以在类上使用对应的@Getter、@Setter、@ToString注解。


@SneakyThrows注解介绍:
@SneakyThrows注解的用途得从java的异常设计体系说起。
java中我们常见的2类异常。
1.普通Exception类,也就是我们常说的受检异常或者Checked Exception。
2.RuntimeException类,既运行时异常。
前者会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。比如网络异常造成IOException。

但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。(强制处理我也处理不了啊!臣妾做不到)所以渐渐的java程序员处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。这种解决思想尤其在Spring中到处出现。参见《Spring in Action》.

try{
}catch(Exception e){
throw new RuntimeException(e);
}

Lombok的@SneakyThrows就是为了消除这样的模板代码,使用注解后不需要担心Exception的处理。


 import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

真正生成的代码:

import lombok.Lombok;

public class SneakyThrowsExample implements Runnable {
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }
  
  public void run() {
    try {
      throw new Throwable();
    } catch (Throwable t) {
      throw Lombok.sneakyThrow(t);
    }
  }
}

原理:
显然魔法 藏在Lombok.sneakyThrow(t);中。可能大家都会以为这个方法就是new RuntimeException()之类的。然而事实并非如此。阅读代码可以看出整个方法其实最核心的逻辑是throw (T)t;,利用泛型将我们传入的Throwable强转为RuntimeException。虽然事实上我们不是RuntimeException。但是没关系,因为JVM并不关心这个。泛型最后存储为字节码时并没有泛型的信息,这样写只是为了骗过javac编译器源码中注释有解释。

    public static RuntimeException sneakyThrow(Throwable t) {
        if (t == null) throw new NullPointerException("t");
        return Lombok.<RuntimeException>sneakyThrow0(t);
    }
    private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {
        throw (T)t;
    }
最后修改:2021 年 11 月 23 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ