lombok原理

淡淡的烟草味﹌ 2023-06-08 06:42 229阅读 0赞
  1. 工作了一年多了,在工作中使用Lombok节省了很多代码量,同时简化优化了代码结构,今天讲解一下lombok的原理。
  2. 1)在java中,注解的两种解析方式,一种是运行时解析,另一种是编译时解析,而lombok就是注解编译时解析。
  3. 编译时解析机制-Pluggable Annotation Processing API(JSR269插入式注解处理器),如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzMyODI5_size_16_color_FFFFFF_t_70

  1. 2Lombok常见注解
  2. 常见方法-@Data
  3. @Getter
  4. @Setter
  5. @ToString
  6. @EqualsAndHashCode
  7. 构造方法
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. @RequiredArgsConstructor
  11. 自动为类添加日志支持-@Slf4j
  12. 自动生成try/catch捕捉异常-@SneakyThrows
  13. 自动生成同步锁-@Synchronized
  14. 自动生成构造这模式-@Builder
  15. 自动调用的close方法释放资源-@Cleanup
  16. 自动生成空值校验-@NonNull
  17. 3) 安装Lombok插件
  18. idea中安装lombok插件,为什么要在idea中安装lombok插件呢?lombok是工作在编译时期,利用注解处理器将代码中的注解解析之后会为我们生成一些代码。比如我们给一个类上加@Getter注解,没有实现get方法,idea实际上是搜索不到get方法的,这样编译器会报错,所以我们在使用lombok之前,要先安装lombok插件。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzMyODI5_size_16_color_FFFFFF_t_70 1

  1. 4)引入lombokjar
  2. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  3. <dependency>
  4. <groupId>org.projectlombok</groupId>
  5. <artifactId>lombok</artifactId>
  6. <version>1.18.8</version>
  7. <scope>provided</scope>
  8. </dependency>
  9. 添加<scope>provided</scope>,因为provided表明该包只在编译和测试的时候用
  10. 5)lombok的使用

在idea中 创建一个测试类Test.java,添加@Data注解

  1. import lombok.Data;
  2. /**
  3. * 测试类
  4. */
  5. @Data
  6. public class Test {
  7. /**
  8. * 姓名
  9. */
  10. private String name;
  11. /**
  12. * 年龄
  13. */
  14. private Integer age;
  15. }
  16. 编译Test.java,得到Test.class文件,我们可以看到插入式注解处理器在解析到注解@Data时,为我们自动生成常见的方法:getsettoString等等。
  17. //
  18. // Source code recreated from a .class file by IntelliJ IDEA
  19. // (powered by Fernflower decompiler)
  20. //
  21. public class Test {
  22. private String name;
  23. private Integer age;
  24. public Test() {
  25. }
  26. public String getName() {
  27. return this.name;
  28. }
  29. public Integer getAge() {
  30. return this.age;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. public void setAge(Integer age) {
  36. this.age = age;
  37. }
  38. public boolean equals(Object o) {
  39. if (o == this) {
  40. return true;
  41. } else if (!(o instanceof Test)) {
  42. return false;
  43. } else {
  44. Test other = (Test)o;
  45. if (!other.canEqual(this)) {
  46. return false;
  47. } else {
  48. Object this$name = this.getName();
  49. Object other$name = other.getName();
  50. if (this$name == null) {
  51. if (other$name != null) {
  52. return false;
  53. }
  54. } else if (!this$name.equals(other$name)) {
  55. return false;
  56. }
  57. Object this$age = this.getAge();
  58. Object other$age = other.getAge();
  59. if (this$age == null) {
  60. if (other$age != null) {
  61. return false;
  62. }
  63. } else if (!this$age.equals(other$age)) {
  64. return false;
  65. }
  66. return true;
  67. }
  68. }
  69. }
  70. protected boolean canEqual(Object other) {
  71. return other instanceof Test;
  72. }
  73. public int hashCode() {
  74. int PRIME = true;
  75. int result = 1;
  76. Object $name = this.getName();
  77. int result = result * 59 + ($name == null ? 43 : $name.hashCode());
  78. Object $age = this.getAge();
  79. result = result * 59 + ($age == null ? 43 : $age.hashCode());
  80. return result;
  81. }
  82. public String toString() {
  83. return "Test(name=" + this.getName() + ", age=" + this.getAge() + ")";
  84. }
  85. }
  86. 6lombok优缺点
  87. lombok的优点
  88. 通过注解自动生成样板代码,提高开发效率
  89. 代码简洁,只关注相关属性
  90. 新增属性后,无需刻意修改相关方法
  91. lombok的缺点
  92. 降低了源代码的可读性和完整性
  93. 加大对问题排查的难度
  94. 需要IDE的相关插件的支持

发表评论

表情:
评论列表 (有 0 条评论,229人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Lombok工作原理

    相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们

    相关 lombok原理

            工作了一年多了,在工作中使用Lombok节省了很多代码量,同时简化优化了代码结构,今天讲解一下lombok的原理。         1)在java中,注解的两

    相关 Lombok工作原理和使用

    Lombok工作原理 在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。自动生成的代码到底是如何产生的呢? 核心之处就是对于注解的解析上。JDK5