前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java奇淫巧技之Lombok

Java奇淫巧技之Lombok

作者头像
高爽
发布2017-12-28 16:51:18
9750
发布2017-12-28 16:51:18
举报
文章被收录于专栏:高爽的专栏高爽的专栏

背景

  我们在开发过程中,通常都会定义大量的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等都实现了该接口,大部分开发者应该都很熟悉这种解析方式。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • Lombok简介
  • Lombok使用
    • 环境
      • 注解介绍
        • @Getter / @Setter
        • @EqualsAndHashCode
        • @ToString
        • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
        • @Data
    • Lombok原理
      • 运行时解析
        • 编译时解析
          • Annotation Processing Tool
          • Pluggable Annotation Processing API
      • Lombok问题
      • 引用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档