Java奇淫巧技之Lombok

背景

  我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,我们来看一下下面这张图,右面是一个简单的JavaBean,只定义了两个属性,在类上加上了@Data,从左面的结构图上可以看到,已经自动生成了上面提到的方法。

Lombok简介

  Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok

Lombok使用

环境

#

#

Maven, Ivy or Gradle

Lombok is in maven central. More…

Javac

Just put lombok.jar on the classpath.

NetBeans

Just put lombok.jar on the classpath and enable annotation processing. More…

Eclipse and variants

Run lombok.jar as a java app (i.e. doubleclick it, usually) to install. Also add lombok.jar to your project. Supported variants: Springsource Tool Suite, JBoss Developer Studio

IDEA IntelliJ

A plugin developed by Michael Plushnikov adds support for most features.

Javadoc

First delombok your code then run javadoc on the result. More…

Android

The proper way to use lombok with android is somewhat complicated but possible. More…

GWT

Lombok works with GWT. More…

Play! Framework

Use Aaron Freeman’s lombok play plugin.

ecj

Lombok works on ecj and ecj-based tools. More…

https://projectlombok.org/download.html

注解介绍

  下面只是介绍了几个常用的注解,更多的请参见https://projectlombok.org/features/index.html

@Getter / @Setter

  可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

@EqualsAndHashCode

  默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。

@ToString

  生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

  无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。

@Data

  @ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,我们使用这个注解就足够了。

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();

编译时解析

编译时解析有两种机制,网上很多文章都把它俩搞混了,分别简单描述一下。

Annotation Processing Tool

  apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:

  • api都在com.sun.mirror非标准包下
  • 没有集成到javac中,需要额外运行

  apt的更多介绍可以参见这里

Pluggable Annotation Processing API

JSR 269,自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:

  Lombok就是使用这种方式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现是HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如Google AutoDagger等等。

Lombok问题

  • 无法支持多种参数构造器的重载
  • 奇淫巧技,使用会有争议

引用

http://notatube.blogspot.fr/2010/11/project-lombok-trick-explained.html http://www.lteconsulting.fr/annotation-processing http://hannesdorfmann.com/annotation-processing/annotationprocessing101 http://docs.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

16位汇编第第四讲常用的7种寻址方式

常用的7中寻址方式 昨天稍微讲了一下,立即数寻址,今天继续讲解寻址方式. (注意,这个属于简陋版的,写了4个小时的博客,也就是第一版,保存了一下,但是博客出问题...

1835
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之数值的整数次方(九度OJ1514)

题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 输入: 输入可能包含多个测试样例。 ...

1917
来自专栏mathor

搜索(8)

1184
来自专栏wOw的Android小站

[Tensorflow] 在Android运行TensorFlow模型

以下代码来自于TensorFlowObjectDetectionAPIModel.java

2441
来自专栏King_3的技术专栏

leetcode-137-Single Number II-第二种解法

1.8K11
来自专栏苦逼的码农

每日一题1:回文整数

分析:有人可能会把它转化为字符串,然后在来逐一比较,显然这在处理速度上是比较慢的。下面是我推荐的两种做法:

763
来自专栏数据结构与算法

23:过滤多余的空格

23:过滤多余的空格 总时间限制: 1000ms 内存限制: 65536kB描述 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。 输入一...

3164
来自专栏数据结构与算法

1807. [NOIP2014]寻找道路P2296 寻找道路

题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点...

2856
来自专栏机器学习算法原理与实践

FP Tree算法原理总结

    在Apriori算法原理总结中,我们对Apriori算法的原理做了总结。作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶...

773
来自专栏C语言及其他语言

[每日一题]IP判断

今天介绍的这题难度不大,和前面的弟弟的作业有异曲同工之妙 题目描述 在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。 合法的IP...

3055

扫码关注云+社区