lombook插件使用
前言
方便程序员开发不用写 set get toString 无参有参(开发工具生成也很快嘛),使 pojo看起来简介,美观,程序员只需通过对应的注解即可,程序可以在编译源码的时候自动生成对应的方法
官网地址 https://projectlombok.org/
Idea添加 Lombok插件
- IDEA中添加Lombok插件, File -> Setting -> Plugins 搜索Lombok Plugin, 点击install,安装完成后重启IDEA。
使用
- 导入 jar 包(官网直接下载)
- maven 方式
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${version}</version> </dependency>
常用注解
@Getter and @Setter
- 可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。
@ToString
- 生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。
@EqualsAndHashCode
- @EqualsAndHashCode 会创建包含所有成员变量的 equals 和 hashCode 方法。 exclude选项可用于通知 Lombok排除某些成员变量。
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
- 全参构造器、部分参数构造器、无参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。
日志
- @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
- @ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,我们使用这个注解就足够了。
@Builder
- 建造者设计模式描述了一种灵活的创建对象的方式。 Lombok可以帮你轻松的实现该模式。
@Singular
- 对集合进行操作,最终生成不可变集合,不可变集合底层是可变集合,修改时会报抛异常.
@Delegate
@Value
- 也是整合包,但是他会把所有的变量都设成 final 的,其他的就跟 @Data 一样,等于同时加了以下注解
@Getter (注意没有setter)
@ToString
@EqualsAndHashCode
@RequiredArgsConstructo
@Accessors
- 使用在 类或字段上,目的是修改 getter 和 setter方法的内容
@Wither
- 不推荐
- 快速生成克隆类
@Delegate
- 不建议使用
- 生成委托对象的方法
types: 委托人
excludes: 被委托人
@ExtensionMethod
- 可以扩展已有的类
- 对代码的风格的影响很大
- 对于父类的扩展不是很好的应用到子类上.
- 在 netbeans中不起作用
- @ExtensionMethod 作用范围没有很好的定义
- 此功能比我们想象中有更多错误
@NonNull
- 对方法参数进行 null 检查通常不是一个坏主意,特别是如果该方法形成的 API被其他开发者使用。虽然这些检查很简单,但是他们可能变得冗长,特别是当你有多个参数时。
@Cleanup
- 自动资源管理:自动调用关闭资源方法 ,默认调用 close() 方法,在 finaly块中,只有在给定的资源不是 null的情况下,才会调用清理方法,如果要清理的对象没有 close()方法,可以指定一个无参方法来进行自动清理.
Lombok 原理
- 了解了简单的使用之后,现在应该比较好奇它是如何实现的。整个使用的过程中,只需要使用注解而已,不需要做其它额外的工作,那玄妙之处应该是在注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。
运行时解析
- 运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,大部分开发者应该都很熟悉这种解析方式。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass); <T extends Annotation> T getAnnotation(Class<T> annotationClass); Annotation[] getAnnotations(); Annotation[] getDeclaredAnnotations();
Lombok问题
- 无法支持多种参数构造器的重载。