概述
目录
- 原理及引入
- maven依赖引入
- 插件支持
- 注解说明
- @AllArgsConstructor
- 作用类型
- 用法说明
- 说明
- @Builder
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @Cleanup
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @CustomLog
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @Data
- 作用类型
- 用法说明
- @Delegate
- 作用类型
- 用法说明
- @EqualsAndHashCode
- 作用类型
- 用法说明
- @Generated
- 作用类型
- 用法说明
- @Getter
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @NoArgsConstructor
- 作用类型
- 用法说明
- @NonNull (未实现)
- 作用类型
- 用法说明
- @RequiredArgsConstructor
- 作用类型
- 用法说明
- @Setter
- 作用类型
- 用法说明
- @Singular
- 作用类型
- 用法说明
- @SneakyThrows
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @Synchronized
- 作用类型
- 用法说明
- @ToString
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
- @Value
- 作用类型
- 用法说明
- @With
- 作用类型
- 用法说明
- 代码示例
- 源码
- 编译后
原理及引入
lombok 基于JSR 269 (可插拔注释)规范,通过修改语法树(AST)供javac在编译时使用。
maven依赖引入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
插件支持
官网https://projectlombok.org/
下载 https://projectlombok.org/download
安装:
IDEA: https://projectlombok.org/setup/intellij
Eclipse: https://projectlombok.org/setup/eclipse
注解说明
**特别提醒:**lombok 的注解包括但不限于如下这些,同时并不意味着所有可用的注解均无使用风险,lombok应根据软件开发环境决定,对一些不稳定的应尽量少用,或者不用。
@AllArgsConstructor
作用类型
ElementType.TYPE
用法说明
生成一个all args构造函数。all args构造函数要求类中的每个字段都有一个参数。
完整的文档可以在@Constructor的项目lombok功能页面上找到。
即使未列出该注释,该注释也具有onConstructor参数。有关更多详细信息,请参阅完整文档。
另见:NoArgsConstructor,RequiredArgsConstructor
说明
新增/删减属性时影响编译结果,可能造成代码不稳定
@Builder
作用类型
ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR
用法说明
生成器注释为被注释的类或包含用@builder注释的成员的类创建所谓的“生成器”方面。
如果对成员进行了注释,则该成员必须是构造函数或方法。如果对一个类进行了注释,则会生成一个包专用构造函数,其中所有字段都是参数(就像类中存在@AllArgsConstructor(access=AccessLevel.package)),就好像这个构造函数是用@Builder注释的。请注意,仅当您没有编写任何构造函数,也没有添加任何显式@xargsconstuctor注释时,才会生成此构造函数。在这些情况下,lombok将假定存在一个all args构造函数,并生成使用它的代码;这意味着如果这个构造函数不存在,就会出现编译器错误。
@Builder的作用是生成一个名为TBuilder的内部类,其中包含一个私有构造函数。TBuilder的实例是使用名为builder()的方法生成的,该方法也是在类本身(而不是在builder类中)中为您生成的。
TBuilder类为带注释的构造函数/方法(在注释类时,每个字段)的每个参数包含一个方法,该方法返回生成器本身。生成器还有一个build()方法,该方法返回原始类型的完整实例,该实例是通过生成器中的各种其他方法将设置好的所有参数传递给用@builder注释的构造函数或方法而创建的。此方法的返回类型将与相关类相同,除非对某个方法进行了注释,在这种情况下,它将等于该方法的返回类型。
完整的文档可以在@Builder的project lombok功能页面上找到。
代码示例
源码
@Builder
class Example<T> {
private T foo;
private final String bar;
}
编译后
class Example<T> {
private T foo;
private final String bar;
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
}
public static class ExampleBuilder<T> {
private T foo;
private String bar;
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}
@Cleanup
作用类型
ElementType.LOCAL_VARIABLE
用法说明
确保通过调用其close方法来清除注释的变量声明,无论发生什么情况。通过将局部变量声明后面的所有语句包装到范围的末尾,并将其放入一个try块来实现,作为finally操作,try块将关闭资源。
完整的文档可以在@Cleanup的project lombok功能页面上找到。
代码示例
源码
public void copyFile(String in, String out) throws IOException {
@Cleanup FileInputStream inStream = new FileInputStream(in);
@Cleanup FileOutputStream outStream = new FileOutputStream(out);
byte[] b = new byte[65536];
while (true) {
int r = inStream.read(b);
if (r == -1) break;
outStream.write(b, 0, r);
}
}
编译后
public void copyFile(String in, String out) throws IOException {
@Cleanup FileInputStream inStream = new FileInputStream(in);
try {
@Cleanup FileOutputStream outStream = new FileOutputStream(out);
try {
byte[] b = new byte[65536];
while (true) {
int r = inStream.read(b);
if (r == -1) break;
outStream.write(b, 0, r);
}
} finally {
if (outStream != null) outStream.close();
}
} finally {
if (inStream != null) inStream.close();
}
}
@CustomLog
作用类型
ElementType.TYPE
用法说明
使lombok基于自定义记录器实现生成记录器字段。
有关lombok日志注释的完整文档,请参见project lombok features页面。
代码示例
配置:
lombok.log.custom.declaration=my.cool.Logger my.cool.LoggerFactory.getLogger(NAME)
源码
@CustomLog
public class LogExample {
}
编译后
public class LogExample {
private static final my.cool.Logger log = my.cool.LoggerFactory.getLogger(LogExample.class.getName());
}
类似用法的还有:
@Log, @CommonsLog, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @JBossLog, @Flogger
@Data
作用类型
ElementType.TYPE
用法说明
为所有字段生成getter、有用的toString方法,以及检查所有非瞬态字段的hashCode和equals实现。还将为所有非最终字段生成setter,以及构造函数。
类似用法::
Getter, Setter, RequiredArgsConstructor, ToString, EqualsAndHashCode, Value
@Delegate
作用类型
ElementType.FIELD, ElementType.METHOD
用法说明
设置任何字段,使lombok生成将调用转发到此字段的委托方法。例子:
private @Delegate Listfoo;
例如,将生成一个布尔add(String)方法,其中包含:return foo。加上(arg);,以及列表中的所有其他方法。该字段类型的所有公共实例方法,以及该字段类型的所有超字段的所有公共实例方法都将被委派,但Object中存在的所有方法、canEqual(Object)方法以及excludes属性中列出的类型中出现的任何方法除外。
@EqualsAndHashCode
作用类型
ElementType.TYPE
用法说明
根据相关字段为所有对象继承的equals和hashCode方法生成实现。
@Generated
作用类型
ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE
用法说明
Lombok最终会自动将此注释添加到所有生成的构造函数、方法、字段和类型中。对于所有代码样式和bug查找工具,都可以将此注释标记为“忽略它”。
@Getter
作用类型
ElementType.FIELD, ElementType.TYPE
用法说明
为类成员或者属性自动生成Getter方法
代码示例
源码
private @Getter int foo;
编译后
public int getFoo() {
return this.foo;
}
@NoArgsConstructor
作用类型
ElementType.TYPE
用法说明
生成一个无参数构造函数。如果由于final字段的存在而无法编写此类构造函数,则将生成错误消息。
即使未列出该注释,该注释也具有onConstructor参数
@NonNull (未实现)
作用类型
ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE
用法说明
如果加上一个参数,lombok将在方法/构造函数主体的开头插入一个空检查,抛出一个参数名为message的NullPointerException。如果放在字段上,任何为该字段赋值的生成方法也将生成这些空检查。
@RequiredArgsConstructor
作用类型
ElementType.TYPE
用法说明
生成具有必需参数的构造函数。必需的参数是最终字段和带有@NonNull等约束的字段。
完整的文档可以在@Constructor的项目lombok功能页面上找到。
即使未列出该注释,该注释也具有onConstructor参数。有关更多详细信息,请参阅完整文档。
@Setter
作用类型
ElementType.FIELD, ElementType.TYPE
用法说明
为类成员或者属性自动生成Getter方法
@Singular
作用类型
ElementType.FIELD, ElementType.PARAMETER
用法说明
单数注释与@Builder一起用于在生成器中为集合创建单个元素的“add”方法。
@SneakyThrows
作用类型
ElementType.METHOD, ElementType.CONSTRUCTOR
用法说明
@Skillythrow将避免javac坚持捕获或抛出方法体中的语句声明生成的任何已检查异常。
@Snealkythrow不会自动吞并、包装到RuntimeException中,或以其他方式修改列出的已检查异常类型的任何异常。JVM不检查检查的异常系统的一致性;javac可以,这个注释允许您选择退出它的机制。
代码示例
源码
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}
编译后
public String utf8ToString(byte[] bytes) {
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException $uniqueName) {
throw useMagicTrickeryToHideThisFromTheCompiler($uniqueName);
// This trickery involves a bytecode transformer run automatically during the final stages of compilation;
// there is no runtime dependency on lombok.
}
@Synchronized
作用类型
ElementType.METHOD
用法说明
几乎和在方法上加上’synchronized’关键字完全一样,只不过会在私有内部对象上同步,这样其他不在您控制下的代码就不会通过锁定自己的实例来干扰线程管理。
对于非静态方法,使用名为
l
o
c
k
的
字
段
,
对
于
静
态
方
法
,
使
用
lock的字段,对于静态方法,使用
lock的字段,对于静态方法,使用lock。如果需要,如果它们还没有出现,将生成它们。字段的内容将可序列化。
@ToString
作用类型
ElementType.TYPE
用法说明
为所有对象继承的toString方法生成一个实现,包括打印相关字段的值。
代码示例
源码
@ToString
public class DemoTest {
private String name;
}
编译后
public String toString() {
return "DemoTest(name=" + this.getName() + ")";
}
@Value
作用类型
ElementType.TYPE
用法说明
生成大量代码,这些代码与表示不可变实体的类相匹配。
@Value注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
相当于@Getter@FieldDefaults(makeFinal=true,level=AccessLevel.PRIVATE)@allargsconstuctor@ToString@EqualsAndHashCode。
@With
作用类型
ElementType.FIELD, ElementType.TYPE
用法说明
添加任何字段,使lombok生成一个“with”-一个withX方法,该方法生成此对象的克隆(1个字段除外,该字段获得一个新值)。
代码示例
源码
private @With final int foo;
编译后
public SELF_TYPE withFoo(int foo) {
return this.foo == foo ? this : new SELF_TYPE(otherField1, otherField2, foo);
}
最后
以上就是眼睛大小白菜为你收集整理的【lombok】 使用及常用注解原理及引入注解说明的全部内容,希望文章能够帮你解决【lombok】 使用及常用注解原理及引入注解说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复