lombok @Builder注解使用的例子、反编译之后的代码详解
lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用
这里对lombok的@Builder和@Data组合的使用示例
import lombok.Builder;
import lombok.Data; @Data
@Builder
public class People {
private String name;
private String sex;
private int age;
}
使用了@Bulider和@Data注解后,就可以使用链式风格优雅地创建对象
public class TestLombok {
@Test
public void testBuilderAnnotation(){
People luoTianyan = People.builder()
.sex("female")
.age(23)
.name("LuoTianyan")
.build();
System.out.println(luoTianyan.toString());
//People(name=LuoTianyan, sex=female, age=23)
People people = new People("LuoTianyan","female",23);
System.out.println(luoTianyan.equals(people));
//true
}
}
class People加上了@Builder和@Data注解后,多了一个静态内部类PeopleBuilder,People调用静态方法builder生成PeopleBuilder对象,PeopleBuilder对象可以使用".属性名(属性值)"的方式进行属性设置,再调用build()方法就生成了People对象,并且如果两个People对象的属性如果相同,就会认为这两个对象相等,即重写了hashCode和equls方法。
这里就直接在Intellij IDEA下,查看反编译的文件People.class;
可以看到,生成的有:
- Getter和Setter方法;
- 访问类型是private无参构造方法,访问类型为default的全部参数的构造方法;
- 重写hashCode、equals、toString方法,则People可以做为Map的key;
- 访问类型为public的静态方法builder,返回的是People.PeopleBuilder对象,非单例;
- 访问类型为public的静态内部类PeopleBuilder,该类主要有build方法,返回类型是People;
- 最后还有个canEqual方法,判断是否与People同类型。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// public class People {
private String name;
private String sex;
private int age; People(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
} public static People.PeopleBuilder builder() {
return new People.PeopleBuilder();
} private People() {
} public String getName() {
return this.name;
} public String getSex() {
return this.sex;
} public int getAge() {
return this.age;
} public void setName(String name) {
this.name = name;
} public void setSex(String sex) {
this.sex = sex;
} public void setAge(int age) {
this.age = age;
} public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof People)) {
return false;
} else {
People other = (People)o;
if (!other.canEqual(this)) {
return false;
} else {
label39: {
Object this$name = this.getName();
Object other$name = other.getName();
if (this$name == null) {
if (other$name == null) {
break label39;
}
} else if (this$name.equals(other$name)) {
break label39;
} return false;
} Object this$sex = this.getSex();
Object other$sex = other.getSex();
if (this$sex == null) {
if (other$sex != null) {
return false;
}
} else if (!this$sex.equals(other$sex)) {
return false;
} if (this.getAge() != other.getAge()) {
return false;
} else {
return true;
}
}
}
} protected boolean canEqual(Object other) {
return other instanceof People;
} public int hashCode() {
int PRIME = true;
int result = 1;
Object $name = this.getName();
int result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $sex = this.getSex();
result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
result = result * 59 + this.getAge();
return result;
} public String toString() {
return "People(name=" + this.getName() + ", sex=" + this.getSex() + ", age=" + this.getAge() + ")";
} public static class PeopleBuilder {
private String name;
private String sex;
private int age; PeopleBuilder() {
} public People.PeopleBuilder name(String name) {
this.name = name;
return this;
} public People.PeopleBuilder sex(String sex) {
this.sex = sex;
return this;
} public People.PeopleBuilder age(int age) {
this.age = age;
return this;
} public People build() {
return new People(this.name, this.sex, this.age);
} public String toString() {
return "People.PeopleBuilder(name=" + this.name + ", sex=" + this.sex + ", age=" + this.age + ")";
}
}
}
自从Java 6起,Javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:
Javac对源代码进行分析,生成一棵抽象语法树(AST)
Javac编译过程中调用实现了JSR 269的Lombok程序
此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树(AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点
Javac使用修改后的抽象语法树(AST)生成字节码文件
lombok @Builder注解使用的例子、反编译之后的代码详解的更多相关文章
- JAVA_Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- 【转】Android APK反编译就这么简单 详解(附图)
转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...
- Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- (转)[置顶] Android APK反编译就这么简单 详解(附图) .
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- Android APK反编译:APKtool使用详解
导言:在我们安卓开发当中,我们不仅需要掌握基础的开发技能,也需要掌握软件的安全技能,这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件,同时也可以让自己的核心技术不会被别人所盗取. 第一步. ...
- Android APK反编译就这么简单 详解
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- JVM常量的含义与反编译助记符详解
1.定义一个常量 public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent ...
- Android APK反编译就这么简单 详解(附图)--转
转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...
- Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置
一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...
随机推荐
- 为什么TCP比UDP可靠真正原因,以及并发编程的基础问题
一 为什么TCP协议比UDP协议传输数据可靠: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程涉及到计算机硬件,也就是物 ...
- ORACLE 归档日志打开关闭方法
一 设置为归档方式 1 sql> archive log list; #查看是不是归档方式 2 sql> alter system set log_archive_start=true ...
- python 插入html到数据库 re.escape() PyMysql
python 把html 网页源码插入到mysql 成功,部分汉字乱码是 mysql编码问题
- TP5中文件的写入路径有的会被自动重定向到首页
TP5中文件的写入路径有的会被自动重定向到public public function export() { $model=model('FanweUser'); $list=$model->w ...
- git 常用操作总结
廖雪峰博客的git 教程写得不错, 很详细,但是却总结的不是很好. 这里哥再详细总结一遍吧! Git鼓励大量使用分支: 查看分支:git branch 创建分支:git branch 切换分支:git ...
- docker利用Dockerfile来制作镜像
在前面的例子(docker tomcat镜像制作)中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我 ...
- <基础> PHP 数据类型
PHP三大数据类型 标量 字符串 单引号:不能解析变量 效率高 双引号 :可以解析变量 效率稍微低一些 heredoc : 大文本 整形 浮点 不能用于比较运算 布尔 复合 数组 超全局数组 ...
- 网站优化--减少HTTP请求
发送HTTP请求需要经过几个过程 域名解析--TCP连接--发送请求--等待--下载资源--解析时间 这其中需要花费一定时间,因此,尽可能的需要减少网站的HTTP请求,方法有以下几种: 1 . css ...
- 静态方法@staticmethod
staticmethod 返回函数的静态方法.该方法不强制要求传递参数,名义上在类里面归类管理,但是不能使用类的变量和实例的变量是类的工具包 如下声明一个静态方法: class Room: t = 1 ...
- Oracle创建表及管理表
转自:https://www.linuxidc.com/Linux/2018-05/152566.htm 1. Oracle表的创建及管理 创建表包括三个要素,表名,列名,数据类型.每个表都有对应 ...