java Lombok之@Accessors用法及说明

目录
  • java Lombok之@Accessors用法
    • fluent属性
    • chain属性
    • prefix属性
  • Lombok @Data @Accessors注解遇到的坑
  • 总结

java Lombok之@Accessors用法

之前用Lombok,只是为了省去写get和set方法,在学习的时候,突然发现,Accessors这个特殊的属性注解竟然还有如此强大的功能,特此为自己的无知记录一下。

fluent属性

fluent:流畅的,流利的意思,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。

@Data
@Accessors(fluent = true)
public class User {
    private int id;
    private String name;
}

可以看到,当我们使用get或者set方法的时候,方法名都是基础的属性名称,非常的简洁

chain属性

chain:链式的,设置为true,则setter方法返回当前对象。

@Data
@Accessors(chain = true)
public class User {
    private int id;
    private String name;
}

如上图可以看出,和常规的get和set方法名称一致,不过区别就是set方法返回的是对象名称,更加的直观,适合对象赋值时的连续赋值参数。

prefix属性

prefix:前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。

@Data
@Accessors(prefix = {"tb","tbn"})
public class User {
    private int tb_id;
    private String tbn_name;
}

可以看出,方法中的get和set方法均过滤了相关的前缀属性,看起来更加的简洁。

Lombok @Data @Accessors注解遇到的坑

碰到个反射的问题,原数据是一个 map,对应数据库表的键值对,此时需要将这个 map 转换成 Entity,所以会用到反射。

用了 Apache BeanUtils,用了 BeanMap 都是不行,无法反射。

如下代码

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.cglib.beans.BeanMap;
 
import java.util.HashMap;
import java.util.Map;
 
public class Test {
 
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", "111");
        map.put("name", "xxxx");
 
        Model model = new Model();
        BeanMap.create(model).putAll(map);
        System.out.println(JSON.toJSONString(model));
    }
 
    @Data
    @Accessors(chain = true)
    public static class Model {
        private String id;
        private String name;
    }
}

此时你会发现其实没问题,但是输出结果如下:

{}

此时办法已经试遍了,后来修改 Entity,将 lombok 注解去掉,发现就OK了。此时不用想,肯定是遇到坑了,然后排查之后发现是 @Accessors 的问题,将其去掉就OK了。

如下:

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.cglib.beans.BeanMap;
 
import java.util.HashMap;
import java.util.Map;
 
public class Test {
 
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", "111");
        map.put("name", "xxxx");
 
        Model model = new Model();
        BeanMap.create(model).putAll(map);
        System.out.println(JSON.toJSONString(model));
    }
 
    @Data
    public static class Model {
        private String id;
        private String name;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java @Accessors注解图文详解

    目录 前言 1. @Accessors 源码 2. @Accessors 属性说明 2.1 fluent 属性 2.2 chain 属性 2.3 prefix 属性 总结 前言 在你的工作中,有时候可能会看到 @Accessors(chain = true)  这样的注解,他是 lombok 插件包中的一个注解,那么它是什么意思呢? 1. @Accessors 源码 我们打开 @Accessors 的源码可以看到: (1)该注解主要作用是:当属性字段在生成 getter 和 setter 方法时

  • @Accessors(chain = true)注解报错的解决方案

    如下所示: Cannot invoke setItemTitle(String) on the primitive type void 定义的实体类如下: @Data public static class RefundOrderItem implements Serializable { /** * 商品标题 */ @JsonProperty("item_title") private String itemTitle; /** * 数量 */ private BigDecimal

  • Lombok如何快速构建JavaBean与日志输出

    目录 快速构建JavaBean与日志输出 以前的JavaBean是这样的 现在的JavaBean是这样的 使用Lombok前的准备操作 @Slf4j IDEA使用lombok输出日志 安装lombok插件 pom.xml加入依赖 使用@Slf4j注解 快速构建JavaBean与日志输出 我们在写基类JavaBean时,当定义了成员变量后,我们不得不添加构造器,setter/getter方法以及toString方法,虽然eclipse等开发工具有一键生成策略,但是对我们来说仍觉得繁琐,并且当我们在

  • java Lombok之@Accessors用法及说明

    目录 java Lombok之@Accessors用法 fluent属性 chain属性 prefix属性 Lombok @Data @Accessors注解遇到的坑 总结 java Lombok之@Accessors用法 之前用Lombok,只是为了省去写get和set方法,在学习的时候,突然发现,Accessors这个特殊的属性注解竟然还有如此强大的功能,特此为自己的无知记录一下. fluent属性 fluent:流畅的,流利的意思,设置为true,则getter和setter方法的方法名都

  • lombok @Accessors用法详解

    @Accessors Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性 fluent fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象.如下 @Data @Accessors(fluent = true) public class User { private Long id; private String name; // 生成的get

  • Java中return的用法(两种)

    Java中的return语句总是和方法有密切关系,return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句). 在return语句的各类文章中,大多仅仅介绍了return语句用于有返回值(非void返回值)的方法中.而很少或没有介绍return语句在vodi返回值方法中的运用. return语句用在非void返回值类型的方法中,不但能返回基本类型,还可以返回(包括用户自定义类的)对象. 一:return语句总是用在

  • 浅析java 的 static 关键字用法

    本篇浅析java中static的用法,主要五个方面:静态成员变量,静态方法,静态块,静态内部类,静态导包. 首先还是一张表格说一下静态对象和非静态对象的区别: 静态对象 非静态对象 归属 类共同具有 类的各个实例独立拥有 内存分配 内存空间上固定的 附属类分配 分配空间顺序 优先分配静态对象空间 优先分配静态对象空间,初始化也一样 1 静态变量,静态方法,静态块 静态对象,静态方法都是在原对象和方法上加上static关键字修饰,表示类可以直接调用这些,而不需要实例化后再调用.具有的好处是: 1-

  • java中Calendar类用法实例详解

    本文实例讲述了java中Calendar类用法.分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助. Calendar常量(field)的作用 Calendar cal = Calendar.getInstance(); cal.get(Calendar.DATE);//-----------------------当天 1-31 cal.get(Calendar.DAY_OF_MONTH);//------

  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解 前言: ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler. 通过继承ChannelHandlerAdapter来代替 因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替. context对象 一个ChannelHandler和一个ChannelHandlerContext对象一起被提供.一个

  • Java中isAssignableFrom的用法详解

    class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口.如果是则返回 true:否则返回 false.如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true:否则返回 false. 1. class2是不是class1的子类或者子接口 2. Object是所有类的父类 一个例子搞定: package com.auuz

  • Java接口和抽象类用法实例总结

    本文实例讲述了Java接口和抽象类用法.分享给大家供大家参考,具体如下: 接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现

  • java中enum的用法

    本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 复制代码 代码如下: enum Day {     SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDAY, FRIDAY, SATURDAY; } 枚举是常量,所以应该用大写. 2. 枚举是对象 枚举隐含地继承了java.lang.Enum,所以它具有java.lang.Enum的属性和方法.遍历枚举: 复制代码 代码如下: public class Main {   

  • java之Object类用法实例

    本文实例讲述了java中Object类用法.分享给大家供大家参考.具体如下: 1.Object类是所有java类的基类 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类,ex: public class Person{ ~~~~~ } 等价于 public class Person extends Object{ ~~~~~ } 2.Object类之equals方法 ①.Object类中定义有: public boolean equals(Object obj)方

随机推荐