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注解介绍:
使用Lombok插件提供的@Data注解也可以实现和setter/getter方法相同的功能。
@Data:注解在类上,其中包含了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor等;
如果属性为final修饰的属性,则不会为该属性生成setter方法。
@Getter:注解可以写在类上或具体的属性上,为类中所有属性或具体的属性提供 getter 方法;
@Setter:注解可以写在类上或具体的属性上,为类中所有非final修饰的属性或具体的非final修饰的属性提供 setter 方法;
@ToString:注解写在类上,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割;
@EqualsAndHashCode:默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals()和hasCode(),也能通过exclude注解来排除一些属性;
@NonNull:该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针;
@Slf4j :注解写在类上,根据用户实际使用的日志框架生成log日志对象;
@Log4j :注解写在类上;为类提供一个 属性名为log 的 log4j 日志对象;
Lombok还提供了很多其它的注解,这里不再列举。
因为@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;
}