Lombok 是一种 Java™ 实用工具,它通过注释来帮助开发人员消除 Java 的冗长部分,尤其是简单的 Java 对象(POJO)。Lombok是如何消除Java中的冗长部分,可浏览《以简单的方式消除 Java 的冗长》。在这里,笔者只是介绍通过反编译由此生成的类文件,从中可看出 Lombok 工具都做了哪些事情。
 
1,编程时需要写的源文件(Lure.java)。我们假设 数据对象不想去写getter/setter等方法;color 属性是不需要包含在toString()、equals()、hashCode()方法中;而且 size 属性是只有包可见访问限制;以及operate()方法要求同步,且内部逻辑需要简化 try/finally语句样式。正如我们看到的,所需要写的代码如下所示,非常简洁。
@ToString(exclude="color")
@EqualsAndHashCode(exclude="color")
public @Data class Lure {
    private String name;
    private @Getter(AccessLevel.PACKAGE) int size;
    private String color;
    private String style;
    private boolean active;
 
    @Synchronized
    public void operate(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);         
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        //write file code goes here
    }
}
2,通过 javap 获得编译后的源文件(Lure.java)。显然,我们没有看到 @Synchronized 说起的作用。事实上,Lombok 是通过添加一个$lock对象来实现的,事实上,可以给 @Synchronized 添加参数的,比如@Synchronized("localock")。而有关toString()、equals()和hashCode()方法的实际情况,只有通过 JD 反编译其类文件后才查看得到(详见 3)。
D:\lombok\src\javac -cp lombok.jar Lure.java
D:\lombok\src\javap Lure
Compiled from "Lure.java"
public class Lure extends java.lang.Object{
    public void operate(java.lang.String[]) throws java.io.IOException;
    public java.lang.String toString();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public spike.lombok.Lure();
    public java.lang.String getName();
    public void setName(java.lang.String);
    public void setSize(int);
    public java.lang.String getColor();
    public void setColor(java.lang.String);
    public java.lang.String getStyle();
    public void setStyle(java.lang.String);
    public boolean isActive();
    public void setActive(boolean);
    int getSize();
}
此外,通过 Eclipse  IDE工具,可浏览到经 Lombok 注释编织代码后的代码树(Outline),见下图:
 
3,然后,试试通过 Java Decompiler 获得反编译后的源文件(Lure.java)内部方法的实现情况会如何。正如我们看到的,Lombok 做得非常棒。它把我们编程时应该写的代码全部编织好了。仅仅是通过少量的特定的注释类。
public class Lure {
 private String name;
 private int size;
 private String color;
 private String style;
 private boolean active;
 private final Object $lock; //因为@Synchronized注释
 public Lure() {
  this.$lock = new Object[0];//因为@Synchronized注释
 }
 public void operate(String[] args) throws IOException {
  synchronized (this.$lock) {//因为@Synchronized注释
   InputStream in = new FileInputStream(args[0]);
   try {//因为 @Cleanup注释
    OutputStream out = new FileOutputStream(args[1]);
    out.close();
   } finally {
    in.close();//因为 @Cleanup注释
   }
  }
 }
 int getSize() { return this.size; }//包可见访问限制, @Getter(AccessLevel.PACKAGE)注释
 public String toString() {//因为 @ToString(exclude="color")注释,见不到处理 color属性
  return "Lure(name=" + this.name + ", size=" + this.size + ", style="
    + this.style + ", active=" + this.active + ")";
 }
 /*
  * 因为@EqualsAndHashCode(exclude="color")注释,见不到处理 color属性
  * 此方法包含反编译生成代码时的错误,如break label64,与Lombok编织代码无关
  */
 public boolean equals(Object o) {
  if (o == this) return true;
  if (o == null) return false;
  if (o.getClass() != super.getClass()) return false;
  Lure other = (Lure) o;
  if (this.name == null)
   if (other.name == null) break label64;
   else if (this.name.equals(other.name)) break label64;
  return false;
  if (this.size != other.size) label64: return false;
  if (this.style == null)
   if (other.style == null) break label110;
   else if (this.style.equals(other.style)) break label110;
  return false;
  label110: return this.active == other.active;
 }
 /*
  * 因为@EqualsAndHashCode(exclude="color")注释,见不到处理 color属性
  * 存在反编译生成代码的情况,如 有 PRIME 的表达式,直接是 31, 与Lombok编织代码无关
  */
 public int hashCode() {
  int PRIME = 31;
  int result = 1;
  result = result * 31 + ((this.name == null) ? 0 : this.name.hashCode());
  result = result * 31 + this.size;
  result = result * 31 + ((this.style == null) ? 0 : this.style.hashCode());
  return result * 31 + ((this.active) ? 1231 : 1237);
 }
 /*
  * 因为 @Data注释,生成了随后的方法
  */
 public String getName() { return this.name; }
 public void setName(String name) { this.name = name; }
 public void setSize(int size) { this.size = size; }
 public String getColor() { return this.color; }
 public void setColor(String color) { this.color = color; }
 public String getStyle() { return this.style; }
 public void setStyle(String style) { this.style = style; }
 public boolean isActive() { return this.active; }
 public void setActive(boolean active) { this.active = active; }
}
小结
必须要说 Lombok 确是个小而精干的实用工具,但还有优化改进的地方,比如 @ToString、@EqualsAndHashCode等注释类的不包括(exclude)只允许单项。这意味着不需要(exclude)多项属性(field)时则不被允许。
 

转载于:https://blog.51cto.com/marchtiger/298029

探测 Lombok 工具相关推荐

  1. ARP探测目标工具arping常用命令集合大学霸IT达人

    ARP探测目标工具arping常用命令集合大学霸IT达人 ARP协议是一种将IP地址转化物理地址的协议.通过ARP请求包和响应包,可以判断一个IP地址是否在使用.同理,通过该协议可以探测局域网主机是否 ...

  2. 暴力探测蓝牙设备工具redfang

    暴力探测蓝牙设备工具redfang 根据是否可以被扫描到,蓝牙设备具有可见(Disoverable)和不可见(non discoverable)两种模式.为了扫描不可见蓝牙设备,Kali Linux提 ...

  3. p0f - 被动探测操作系统工具

    参考:http://lcamtuf.coredump.cx/p0f3/ p0f是一款被动探测工具,能够通过捕获并分析目标主机发出的数据包来对主机上的操作系统进行鉴别,即使是在系统上装有性能良好的防火墙 ...

  4. Lombok工具 : 常用注解介绍 (全)

    文章目录 介绍 引入Maven依赖 常用的注解 @NoArgsConstructor/@AllArgsConstructor @RequiredArgsConstructor @Getter/@Set ...

  5. lombok工具中@Data注解问题

    2019独角兽企业重金招聘Python工程师标准>>> @Data的主要问题,应该是equals()方法,hashCode()方法等的重写问题. 这里,推荐阅读以下,这几篇博客,有助 ...

  6. Liunx下AWVS全自动探测漏洞工具の介绍及安装

    简介 Acunetix Web Vulnerability Scanner(AWVS)经典商业漏扫工具,最近更新了13的版本,本文分享的AWVS的破解版是网上大佬们分享出来的我只是一个小小搬运工.刚好 ...

  7. 利用ICMP协议,使用python原始套接字实现主机存活探测工具

    一.课题概述. 一学期一次的课程设计终于开始了(停课两周,马上放寒假了,哈哈哈哈哈哈...)这次我们课程设计的科目是计算机协议,我们小组抽到的题目是利用ICMP模仿ping命令写一个主机存活探测的工具 ...

  8. 【办公软件免费版】万彩办公大师教程丨重复图片探测工具

    万彩办公大师的重复图片探测清理工具将需要探测的文件夹加入清单,设定比对条件与相似度便可开始探测重复图片.支持4种比对方式,包括比较画面.散列.图片大小和Exif数据原始时间 一.运行重复图片探测工具 ...

  9. GitHub上整理的一些工具【转载】

    技术站点Hacker News:非常棒的针对编程的链接聚合网站Programming reddit:同上MSDN:微软相关的官方技术集中地,主要是文档类infoq:企业级应用,关注软件开发领域OSCh ...

最新文章

  1. 基于HTML5 Canvas 实现矢量工控风机叶轮旋转
  2. 初学者如何搭建一个自己专属的电子实验室?
  3. FireFox 开始放弃 Flash:停止部分内容支持
  4. python 读写数据
  5. linux函数没有返回值导致溢出,Shell中函数返回值超出问题
  6. 首发:李航老师的《统计学习方法》第二版的代码实现(Github标星过万!)
  7. RESTful Web Service
  8. 双螺杆制冷压缩机行业调研报告 - 市场现状分析与发展前景预测
  9. 静态路由实现负载均衡和高可用
  10. 201509-2-日期计算
  11. web渗透测试入门01
  12. linux 系统安装Iso,linux系统安装iso文件方法
  13. WhatsApp营销工具有哪些?
  14. vs2019配置glfw、glad等环境
  15. 程序员的自我修养-读后感
  16. 思科计算机网络(1)计算机网络概述
  17. 博弈论(Nim游戏、有向图游戏之SG函数)
  18. 统计学习(一):最大似然估计
  19. Linux常用命令笔记
  20. 论文查重自己文章会查吗?

热门文章

  1. codevs 3054 高精度练习-文件操作
  2. XeLaTeX插入GB/T 7714-2005规范的参考文献方法
  3. struts的国际化
  4. 如何分析apache日志[access_log(访问日志)和error_log(错误日志)]
  5. 实现table鼠标移动改变table行背景色
  6. Mangos自己制作装备
  7. 一份厘清「数据指标」问题的清单
  8. 【独家】搜狗黎志:创新和竞争是推动时代发展的原动力
  9. .Net IOC框架入门之三 Autofac
  10. UI组件-UISlider