前文

属性装数据 + 方法做功能 + 注解(相当于打标签注意哈他给类也能打标签)=三样凑成类(这就是孙悟空的图纸还没活),new 就是对象(他就是活的孙悟空)。
        我按照图纸造出来的一个有着孙悟空所有技能的原始本体,但他不是孙悟空因为他还没活过来。我现在new一个名字,不叫孙悟空,叫猪八戒,他活过来就叫猪八戒,但拥有了孙悟空的所有技能 。并且给他注解好,他有孙悟空的所有技能,但形是猪八戒,名字叫猪八戒。这就叫注解。

        而反射就是仙法”白眼”-(透视扫描功能+万能操作器)我不用知道你对象是猪八戒还是孙悟空,我用反射一眼看穿里面的方法啊注解啊属性啊,你外面穿了个猪八戒的形,内是孙悟空的技能我看的一清二楚。同时还能反射随时修改+调用属性、注解、方法,唯独改不了它天生的本源类图纸,也不能随便改注解标签。

lombk注解是第三方注解和上文的原生注解是2回事

常用原生注解 VS Lombok注解 对照表(超好记)

一、Java 原生自带注解(不用引任何依赖,JDK 就有)

原生注解

作用大白话

会不会自动生成代码

@Override

告诉编译器:我重写了父类方法,防止写错方法名

❌ 不会,只是标记

@Deprecated

标记这个类 / 方法过时了,不建议再用

❌ 只是标记提醒

@SuppressWarnings

压制黄色警告,不让编辑器飘黄线

❌ 只是屏蔽警告

@FunctionalInterface

标记函数式接口,只能有 1 个抽象方法

❌ 只是规则限制

�� 共同点
都是 纯标记,只起提示、约束作用,不会帮你多写一行代码

二、Lombok 第三方注解(要引依赖、装插件)

Lombok 注解

作用大白话

会不会自动生成代码

@Data

一键生成 get、set、toString、equals、hashCode

✅ 全自动生成

@NoArgsConstructor

自动生成无参构造

✅ 自动造构造方法

@AllArgsConstructor

自动生成全参构造

✅ 自动造构造方法

@Getter

只给所有字段生成 get 方法

✅ 自动生成

@Setter

只给所有字段生成 set 方法

✅ 自动生成

@Builder

生成链式建造者模式

✅ 自动生成

@Slf4j

自动给类生成 log 日志对象

✅ 自动生成

�� 共同点
都是第三方注解,不止标记,编译时偷偷帮你把重复代码全写好

三、一句话终极区分

  1. Java 原生注解:只是打标签、做提醒,代码还得你自己写;
  1. Lombok 注解:打标签 + 帮你自动生成一堆重复代码

四、补充:还有 Spring 注解(也算第三方注解)

比如 @Controller@Service@RequestMapping
也是第三方注解,和 Lombok 一样不是 JDK 自带,
只不过作用不一样:

  • Lombok:帮你省手写代码
  • Spring 注解:帮你做项目托管、路由、分层

这下三种注解:原生、Lombok、Spring 你彻底分得清了。

@Data 一键生成get/set等方法的原理

核心结论:@Data 能一键生成代码,本质是 Lombok 借助 Java 注解处理器(Annotation Processor),在编译阶段“偷偷帮你写好代码”,不是运行时生成,也不是“魔法”,只是帮你省去了手动书写的麻烦。

一、关键前提(你已经满足)

你之前已经做了2件事,这是@Data能生效的基础,缺一不可:

  1. 项目引入了 Lombok 依赖:依赖里包含了@Data注解的定义,以及“生成代码的工具(注解处理器)”;
  1. IDE 安装了 Lombok 插件:让 IDE 能识别@Data注解,不会报红(比如找不到get/set方法),但插件不负责生成代码,只是“识别”。

二、@Data 生成代码的完整流程(一步一步讲懂)

你写的代码 → 编译器编译 → Lombok 介入 → 生成完整代码 → 最终运行,具体分3步:

1. 你写的简化代码(仅字段+@Data)

这是你实际写的内容,非常简洁:

java
import lombok.Data;

@Data
public class Account {
    private Integer id;
    private String name;
    private String password;
}

2. 编译阶段:Lombok 注解处理器“干活”

当你点击“运行”或“编译”时,Java 编译器会先执行“注解处理”步骤:

  • 编译器会扫描你的代码,发现 Account 类上有 @Data 注解;
  • 此时,Lombok 提供的“注解处理器”会被触发(这个处理器就是你引入的 Lombok 依赖里的代码);
  • 注解处理器会“读取”Account 类里的所有字段(id、name、password),然后按照固定规则,自动生成 get/set、toString、equals、hashCode 这5类方法的代码。

3. 最终生成的完整代码(你看不到,但实际存在)

Lombok 生成代码后,会把生成的代码“注入”到编译后的字节码(.class 文件)中,相当于编译器最终看到的代码是这样的(你不用写,Lombok 自动补全):

java
public class Account {
    private Integer id;
    private String name;
    private String password;

    // Lombok 自动生成的 get 方法
    public Integer getId() {
        return this.id;
    }
    public String getName() {
        return this.name;
    }
    public String getPassword() {
        return this.password;
    }

    // Lombok 自动生成的 set 方法
    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    // Lombok 自动生成的 toString 方法
    @Override
    public String toString() {
        return "Account(id=" + this.id + ", name=" + this.name + ", password=" + this.password + ")";
    }

    // Lombok 自动生成的 equals 方法
    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (o == null) return false;
        if (o.getClass() != this.getClass()) return false;
        Account other = (Account) o;
        if (this.id == null ? other.id != null : !this.id.equals(other.id)) return false;
        if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false;
        return this.password == null ? other.password == null : this.password.equals(other.password);
    }

    // Lombok 自动生成的 hashCode 方法
    @Override
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        result = result * PRIME + (this.id == null ? 43 : this.id.hashCode());
        result = result * PRIME + (this.name == null ? 43 : this.name.hashCode());
        result = result * PRIME + (this.password == null ? 43 : this.password.hashCode());
        return result;
    }
}

三、关键注意事项(新手必看)

  1. 生成时机:只在编译阶段生成,运行时不会再生成,所以运行速度和你手动写代码完全一样,不影响性能;
  1. 看不到生成的代码:你在 IDE 里只能看到自己写的简化代码,生成的代码藏在编译后的 .class 文件里(可以通过 IDE 反编译查看);
  1. 不影响原有代码:如果你来手动写了某个方法(比如自己重写了 toString),Lombok 会“让步”,不会重复生成这个方法;
  1. 依赖和插件缺一不可:少了依赖,注解处理器不存在,无法生成代码;少了插件,IDE 识别不了注解,会报红(但编译运行能正常生效)。

四、一句话总结(好记不绕)

@Data 就像一个“编译期的自动打字员”,你给它标上注解、写下字段,它就会在编译器编译代码时,自动帮你把 get/set、toString 等重复代码全部敲好,省你手动书写的时间。

🔥 Lombok 10 大常用注解 + 示例代码

1. @Data(全能王)

生成:get、set、toString、equals、hashCode

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String name;
}

// 使用
User user = new User();
user.setId(1);       // set自动生成
user.getName();      // get自动生成
user.toString();     // 自动生成

2. @NoArgsConstructor(无参构造)

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class User {
    private Integer id;
}

// 使用
User user = new User(); // 无参构造

3. @AllArgsConstructor(全参构造)

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
}

// 使用
User user = new User(1, "张三");

4. @Getter(只生成 get)

import lombok.Getter;

@Getter
public class User {
    private Integer id;
}

// 使用
user.getId(); // 只有get,没有set

5. @Setter(只生成 set)

import lombok.Setter;

@Setter
public class User {
    private Integer id;
}

// 使用
user.setId(100); // 只有set

6. @ToString(只生成 toString)

import lombok.ToString;

@ToString
public class User {
    private Integer id;
    private String name;
}

// 使用
System.out.println(user); // 自动打印所有字段

7. @EqualsAndHashCode

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
    private Integer id;
}

// 使用
user1.equals(user2); // 自动比较字段

8. @Builder(链式构造,超级好用)

import lombok.Builder;

@Builder
public class User {
    private Integer id;
    private String name;
}

// 使用(链式写法)
User user = User.builder()
                .id(1)
                .name("张三")
                .build();

9. @Slf4j(日志,不用自己创建 log 对象)

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Test {
    public void test() {
        log.info("日志输出"); // 直接用
    }
}

10. @RequiredArgsConstructor(给 final 字段生成构造)

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class User {
    private final Integer id;
    private String name;
}

// 使用:只生成包含 final 字段的构造
User user = new User(100);

✅ 工作最常用组合(必背)

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Integer id;
    private String name;
}

安装lombok工具

https://projectlombok.org/官方网站

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐