lombok介绍

1 lombok介绍
lombok 提供了简单的注解Annotation的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,比如 javabean 属性的get 方法,set方法,无参数构造,全部参数的构造函数等
2 lombok 使用
lombok是基于注解的,我们先看看它常用注解的作用
@Data   :注解在类上;提供类所有属性的getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法         @Setter:注解在属性上;为属性提供 setting 方法         @Getter:注解在属性上;为属性提供 getting 方法         @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象         @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法         @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
2.1 使用lombok前的做法
public class CarModelDO implements Serializable {
    /**
    *
    */
   private static final long serialVersionUID = 1L;
   private String id;
    private String brand;
    private String brandCode;
    private String series;
    private String seriesCode;
    private String seriesRemark;
    private int factor_1;
    private Date dtCreate;
    private Date dtUpdate;
   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getBrand() {
      return brand;
   }
   public void setBrand(String brand) {
      this.brand = brand;
   }
   public String getBrandCode() {
      return brandCode;
   }
   public voidsetBrandCode(String brandCode) {
      this.brandCode = brandCode;
   }
   public String getSeries() {
      return series;
   }
   public void setSeries(Stringseries) {
      this.series = series;
   }
   public String getSeriesCode() {
      return seriesCode;
   }
   public voidsetSeriesCode(String seriesCode) {
      this.seriesCode = seriesCode;
   }
   public String getSeriesRemark() {
      return seriesRemark;
   }
   public voidsetSeriesRemark(String seriesRemark) {
      this.seriesRemark = seriesRemark;
   }
   public int getFactor_1() {
      return factor_1;
   }
   public void setFactor_1(int factor_1) {
      this.factor_1 = factor_1;
   }
   public Date getDtCreate() {
      return dtCreate;
   }
   public void setDtCreate(DatedtCreate) {
      this.dtCreate = dtCreate;
   }
   public Date getDtUpdate() {
      return dtUpdate;
   }
   public void setDtUpdate(DatedtUpdate) {
      this.dtUpdate = dtUpdate;
   }
   
}
可以看到这是我们常规的写法
2.2 使用lombok做法
 
 
 @Data
public class CarModelDOimplements Serializable {
    private String id;
    private String brand;
    private String brandCode;
    private String series;
    private String seriesCode;
    private String seriesRemark;
    private int factor_1;
    private Date dtCreate;
    private Date dtUpdate;
}
 
反编译后的代码:
public class CarModelDOimplements Serializable {
   private String id;
   private String brand;
   private String brandCode;
   private String series;
   private String seriesCode;
   private String seriesRemark;
   private int factor_1;
   private Date dtCreate;
   private Date dtUpdate;
   public String toString() {
      return “CarModelDO(id=” +getId() + “, brand=” + getBrand() + “,brandCode=” + getBrandCode() + “,series=”
            + getSeries() + “,seriesCode=” + getSeriesCode() + “,seriesRemark=” + getSeriesRemark()
            + “,factor_1=” + getFactor_1() + “,dtCreate=” + getDtCreate() + “,dtUpdate=” + getDtUpdate() + “)”;
   }
   public inthashCode() {
      int PRIME = 59;
      int result = 1;
      Object $id =getId();
      result = result * 59 + ($id == null ? 43 : $id.hashCode());
      Object $brand =getBrand();
      result = result * 59 + ($brand == null ? 43 : $brand.hashCode());
      Object $brandCode =getBrandCode();
      result = result * 59 + ($brandCode == null ? 43 : $brandCode.hashCode());
      Object $series =getSeries();
      result = result * 59 + ($series == null ? 43 : $series.hashCode());
      Object $seriesCode =getSeriesCode();
      result = result * 59 + ($seriesCode == null ? 43 : $seriesCode.hashCode());
      Object $seriesRemark =getSeriesRemark();
      result = result * 59 + ($seriesRemark == null ? 43 : $seriesRemark.hashCode());
      result = result * 59 +getFactor_1();
      Object $dtCreate =getDtCreate();
      result = result * 59 + ($dtCreate == null ? 43 : $dtCreate.hashCode());
      Object $dtUpdate =getDtUpdate();
      result = result * 59 + ($dtUpdate == null ? 43 : $dtUpdate.hashCode());
      return result;
   }
   protected booleancanEqual(Object other) {
      return other instanceofCarModelDO;
   }
   public boolean equals(Objecto) {
      if (o == this) {
         return true;
      }
      if (!(o instanceofCarModelDO)) {
         return false;
      }
      CarModelDO other =(CarModelDO) o;
      if (!other.canEqual(this)) {
         return false;
      }
      Object this$id =getId();
      Object other$id = other.getId();
      if (this$id == null ? other$id != null : !this$id.equals(other$id)) {
         return false;
      }
      Object this$brand =getBrand();
      Object other$brand = other.getBrand();
      if (this$brand == null ? other$brand != null : !this$brand.equals(other$brand)) {
         return false;
      }
      Object this$brandCode =getBrandCode();
      Object other$brandCode = other.getBrandCode();
      if (this$brandCode == null ? other$brandCode != null : !this$brandCode.equals(other$brandCode)) {
         return false;
      }
      Object this$series =getSeries();
      Object other$series = other.getSeries();
      if (this$series == null ? other$series != null : !this$series.equals(other$series)) {
         return false;
      }
      Object this$seriesCode =getSeriesCode();
      Object other$seriesCode = other.getSeriesCode();
      if (this$seriesCode == null ? other$seriesCode != null : !this$seriesCode.equals(other$seriesCode)) {
         return false;
      }
      Object this$seriesRemark =getSeriesRemark();
      Object other$seriesRemark = other.getSeriesRemark();
      if (this$seriesRemark == null ? other$seriesRemark != null : !this$seriesRemark.equals(other$seriesRemark)) {
         return false;
      }
      if(getFactor_1() != other.getFactor_1()) {
         return false;
      }
      Object this$dtCreate =getDtCreate();
      Object other$dtCreate = other.getDtCreate();
      if (this$dtCreate == null ? other$dtCreate != null : !this$dtCreate.equals(other$dtCreate)) {
         return false;
      }
      Object this$dtUpdate =getDtUpdate();
      Object other$dtUpdate = other.getDtUpdate();
      return this$dtUpdate == null ? other$dtUpdate == null : this$dtUpdate.equals(other$dtUpdate);
   }
   public voidsetDtUpdate(Date dtUpdate) {
      this.dtUpdate = dtUpdate;
   }
   public voidsetDtCreate(Date dtCreate) {
      this.dtCreate = dtCreate;
   }
   public voidsetFactor_1(int factor_1) {
      this.factor_1 = factor_1;
   }
   public voidsetSeriesRemark(String seriesRemark) {
      this.seriesRemark = seriesRemark;
   }
   public voidsetSeriesCode(String seriesCode) {
      this.seriesCode = seriesCode;
   }
   public voidsetSeries(String series) {
      this.series = series;
   }
   public voidsetBrandCode(String brandCode) {
      this.brandCode = brandCode;
   }
   public voidsetBrand(String brand) {
      this.brand = brand;
   }
   public voidsetId(String id) {
      this.id = id;
   }
   public Date getDtUpdate() {
      return this.dtUpdate;
   }
   public Date getDtCreate() {
      return this.dtCreate;
   }
   public intgetFactor_1() {
      return this.factor_1;
   }
   public StringgetSeriesRemark() {
      return this.seriesRemark;
   }
   public StringgetSeriesCode() {
      return this.seriesCode;
   }
   public String getSeries(){
      return this.series;
   }
   public StringgetBrandCode() {
      return this.brandCode;
   }
   public String getBrand() {
      return this.brand;
   }
   public String getId() {
      return this.id;
   }
}
 
和上面2.1的代码是一样的,而且还给我们生成了其它方法。
其它Annotaion 使用参照上面的用法。
2.3 开发使用方法
1 编译类路径下增加 lombok.jar,下面是maven方式
<dependency>
<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.8</version>
    <scope>provided</scope>
 </dependency>
2 在需要使用javabean类上加上注解
3 java源代码编译后经过得到对应的字节码,见反编译
3 Mac 下eclipse 安装lombok
eclipse编译java源文件使用的是EclipseCompiler for Java (ECJ).要想使ECJ支持lombok,得进行设置,在Eclipse安装目录中eclipse.app的eclipse.ini文件中添加如下两行设置,以我的机器为例,
在/usr/local/eclipse-jee/Eclipse.app/Contents/MacOS/eclipse.ini最后增加如下两行
-Xbootclasspath/a:lombok.jar
-javaagent:/usr/local/eclipse-jee/lombok.jar
Intellij Idea 可以选择编译工具为oraclejavac。
4 原理介绍
2005.2.1 Sun公司在提交了JSR 269,用于支持在编译期对annotation进行处理(this JSRwill define APIs to allow annotation processors to be created using a standardpluggable API. This will simplify the task of creating annotation processorsand will also allow automation of the discovery of appropriate annotationprocessors for a given source file.)
自从java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。 而 Lombok就是实现该规范,规范介绍:https://jcp.org/en/jsr/detail?id=269
oracle JDK编译java源代码的简单介绍图:
1.分析和输入到符号表(Parse and Enter)
   Parse过程所做的工作有词法和语法分析。词法分析要完成将代码字符串转变为Token序列。语法分析则是根据语法将Token序列生成抽象语法树。
   Enter过程将符号输入到符号表,通常包括确定类的超类型和接口、根据需要添加默认构造器、将类中出现的符号输入类自身的符号表中等。
2.注解处理(Annotation Processing)
   该步骤主要用于处理用户自定义的annotation,可能带来的好处是基于annotation来生成附加的代码或进行一些特殊的检查,从而节省一些共同的代码的编写。此功能基于JSR269,在Sun JDK6 中提供了支持,在注解处理完之后,再次进入上一步骤。
3.语义分析和生成class文件(Analyse and Generate)
   该步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字、表达式等元素与变量、方法、类型等联系在一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配性;进行常量折叠;检查所有语句都可到达;检查所有checked exception 都被捕获或抛出;检查变量的确定性赋值(例如有返回值的方法必须确定有返回值);检查变量的确定性不重复赋值(例如声明为final的变量等);解除语法糖(消除if(false){…}形式的无用代码;将泛型Java转为普通Java;将含有语法糖的语法树改为含有简单语言结构的语法树,例如foreach循环、自动装箱/拆箱等)。
    在完成了语义分析后,开始生成class文件,生成的步骤为:首先将实例成员初始化器收集到构造器中,将静态成员初始化收集为<clinit>();接着将抽象语法树生成字节码,采用的方法为后序遍历语法树,并进行最后的少量代码转换(例如String相加转变为StringBuilder操作);最后从符号表生成class文件。
4.class文件内容
   class文件中并不仅仅存放了字节码,还存放了很多辅助JVM来执行class的附加信息,一个class文件包含了以下信息:
    1)结构信息
     包括class文件格式版本号及各部分的数量与大小的信息
    2)元数据
     简单来说,可以认为元数据对应的就是Java源码中“声明”与“常量”的信息,主要有:类、继承的超类、实现的接口声明信息、域与方法声明信息和常量池。
    3)方法信息
      方法信息对应的就是Java源码中的“语句”与“表达式”对应的信息,主要有:字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试用符号信息。

Java开发牛人十大必备网站

以下是我收集的Java开发牛人必备的网站。这些网站可以提供信息,以及一些很棒的讲座, 还能解答一般问题、面试问题等。质量是衡量一个网站的关键因素,我个人认为这些网站质量都很好。接下来,我会跟大家分享我是如何使用这些网站学习和娱乐的。或许你会认为有些网站适合任何水平的开发者,但是我认为:对于Java开发牛人来说,网站的好坏取决于如何使用它们。

1、Stackoverflow

Stackoverflow.com 可能是编程界中最流行的网站了,该网站有成千上万个好问题和答案。学习API或者编程语言,通常依赖于代码示例,stackoverflow就可以提供大量的代码片段。

Stackoverflow的另一个优点在于它的社交性。你可以在一些特定的标签下查看问题,比如“Java”、“regex”,你就会看到哪些是高频问题。这对于学习,以及Java博主书写热门话题都是一种非常好的资源。

网站地址:http://stackoverflow.com/

2、DZone

这是一个非常有趣的网站,有相当多的开发者在这个网站上分享他们博客文章。就像一场冒险一样,在这里,你永远不知道下一秒会看到什么内容。

网站地址:http://www.dzone.com

3、LeetCode

如果有Java方面的面试问题,例如“在Java中,内存中的数组是什么样的”,你可以从很多Java教程中找到答案。但是,遇到类似于“如何将SortedArray转化成一个BalancedTree”这样的问题,你就应该去求助LeetCode了。LeetCode包含一系列算法问题, 它能为有关信息技术的面试提供一个社会性的平台。这个网站最好的地方就是,它可以通过大小不同的数据在线检查你的代码是否正确。很多人认为,面试成功的关键在于重复这三个重要步骤:编码->阅读->讨论。

网站地址: http://leetcode.com/

4、Java SE技术文档

这个网站包含了在使用Java SE API时会用到的所有文档,即使你是Java开发牛人,我敢肯定在这里你仍能发现一些有用的东西。比如,你可以阅读一些像“Java类的本质”、“部署”这样的教程。

网站地址: http://docs.oracle.com/javase/

5、Github

你也许知道可以免费的将你的项目托管在哪,但你不一定知道它还是一个学习当今流行的Java库和框架的优秀资源。比如,你想学 Spring MVC Framework,你可以搜索并且找到一些开源的项目。遵循“照葫芦画瓢”的原则,你能够通过实例快速的学习框架,尤其是你已经具有使用类似框架的经验。

网站地址:https://github.com/

6、Coursera

这是有关视频讲座的最好网站,在这里你可以找到许多顶尖学校的著名教授的优秀计算机科学课程。这些教授中,有些甚至是一些计算机科学领域的发明者。

网站地址:https://www.coursera.org/

7、Java World

这个网站包含了大量的Java教程,涉及各种各样的话题。其中很多文章都写的很好,并且有图片、插图进行说明。它可以被用来当作深度学习的教科书。

网站地址:http://www.javaworld.com/

8、IBM developerWorks

这里有很多由IBM公司的人写的非常不错的文章。

网站地址:http://www.ibm.com/developerworks/java/

9、Wikipedia 维基百科

这个网站是查询或学习几乎所有概念的最好的资源之一。例如,作为一个资深的Java开发人员,你可能只是想了解一些概念并不想深度研究。这里是一个可以免费查询最新信息的好地方。例如,什么是面向服务的编程?另外,它还能为你的写作提供大量素材。比如,同一个词在不同的领域可能会有完全不同的含义。有时,研究这些词在不同领域的不同含义是非常有意思的。

网站地址: http://en.wikipedia.org/wiki/

10、Program Creek

与以上几个网站相比,Programcreek.com在规模上要小很多。但是规模小也有优点,它在维护方面做的更好,读起来更有趣。在这里,你可以找到其他任何网站都不曾涉及到的话题,而且几乎每篇文章都包含漂亮的插图或者示例代码。它包含了来自不同领域的人发表的文章(科研、工业),并且经常为Java开发者提供优质材料。希望有一天,它也会出现在一些人的网站前十名排行名单中。

网站地址: http://www.programcreek.com/

注:当然,对于Java开发牛人来说还有很多其它不错的网站。如果你认为有其他的网站也应该列在这里,请留言,我以后也会把它们加进去。谢谢。

网友推荐:

感谢网友的热情推荐,这里会不断更新网友推荐的优秀网站。

原文链接: programcreek 翻译: ImportNew.com – 张文太
译文链接: http://www.importnew.com/7980.html
转载请保留原文出处、译者和译文链接。]