什么是lombok
- 一个优秀的Java代码库,简化了Java的编码,为Java代码的精简提供了一种方式
使用方法:pom文件中引入依赖
<!--scope:provided,只在编译阶段生效,不需要打入包中-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
@Getter/@Setter
-
作用类上,生成所有成员变量的set/get方法
-
作用于成员变量上,生成该成员变量的set/get方法
-
方法控制访问级别@Getter/@Setter注解加上AccessLevel:PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,NONE(不生成);示例:@Getter(AccessLevel.PRIVATE)
-
final修饰只会生成get方法
-
static修饰不会生成set/get方法
@NonNull
-
作用于方法上或者属性,用于非空判断,如果为空则抛异常
-
代码
public void test(@NonNull String name) { System.out.println(name); }
-
字节码
public void test(@NonNull String name) { if (name == null) { throw new NullPointerException("name is marked non-null but is null"); } else { System.out.println(name); } }
构造器注解
-
@NoArgsConstructor无参构造器
-
@AllArgsConstructor全参构造器
-
@RequiredArgsConstructor
- 指定参数的构造函数,有以下特征的字段:final类型未被初始化的属性,标记了@NonNull的属性
@ToString
- 作用于类,覆盖默认的toString()方法
- 不包括某个字段
@ToString(exclude = {"createTime"})
- 只输出某个字段
@ToString(of = {"createTime"})
@EqualsAndHashCode
- 作用于类,覆盖默认的equals和hashCode方法,作用于全部字段
- 不包括某个字段
@EqualsAndHashCode(exclude = {"createTime"})
- 只输出某个字段
@EqualsAndHashCode(of = {"createTime"})
@Data
- 作用于类上,是以下注解的集合
- Getter
- Setter
- RequiredArgsConstructor
- ToString
- EqualsAndHashCode
@Builder
- 构造者模式:又称之为建造者模式
- 场景:当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式
- 谷歌的开源protobuf协议生产的java bean赋值就是采用建造者模式
- @Builder作用于类上
- 使用:
User user = User.builder().id(1).build();
@Log/@Sl4j
-
作用于类上,生成日志变量,用于记录日志
-
使用:
log.info("info日志");
使用注意点
如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper = true)的话,会默认@EqualsAndHashCode(callSuper = false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放
lombok实现原理
-
熟悉Java自定义注解的同学已经猜到是JSR269插件化注解处理
-
JSR269:Pluggable Annotation Processing API实现在Javac编译阶段利用“Annotation Processor“对自定义的注解进行预处理后生成真正在JVM上面执行的Class文件
-
JSR是Java Specification Requests的缩写,意思是Java规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准
-
lombok解析流程如下
Javac解析成AST抽象语法树后,lombok根据自己编写的注解处理器,动态的修改AST增加新的节点(即lombok自定义注解所需要生成的代码),最终生成JVM可执行的字节码Class文件
-
能实现上述效果的还有一个反射技术,那两个对比如何?
- 使用Annotation Processing自定义注解是在编译阶段进行修改
- JDK反射技术是在运行时动态修改
- 结论:反射更加灵活但是带来的性能损耗更加大