Delombok 是个啥?居然可破 Lombok?

目录

环境准备

项目准备

编写脚本

运行脚本


传送门:《Lombok 使用详解》

Delombok 原本就是 Lombok 出的一个神器,可以让你使用一个命令把 Lombok 注解实现的类文件转换为不使用 Lombok 的 Java 源文件。如果是 src 整个目录,可以递归的实现转换,Delombok 会自动过滤非 Lombok 注解的文件进行原样拷贝。

Delombok 的出现让我们不仅可以了解到 Lombok 的实现内幕,还可以很好的做系统升级,比如要生成 javadoc 或者使用 Google Widget Toolkit 都是不支持  Lombok 的,这时候就可以使用 Delombok 进行反编译,同时也能解决我们使用 Lombok 升级 JDK 带来的不兼容问题。

话不多少直接 run 起来

环境准备

直接在官网下载 lombok.jarhttps://projectlombok.org/downloads/lombok.jar

项目准备

创建项目,分别编写 User.java 和 application.properties,UserMapper.xml ,User.java 是使用的 Lombok 的 Java 类,其余两个配置文件为了验证 Delombok 的功能,最后把刚才下载下来的 lombok.jar 放在项目的根目录。

Delombok 是个啥?居然可破 Lombok?_第1张图片

其中 User.java 的文件如下

package com.github.juice.resume;

import lombok.*;

import java.io.FileInputStream;
import java.io.InputStream;

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

    public static void main(String[] args) {

        // @NoArgsConstructor 生成
        new User();

        // @AllArgsConstructor 生成
        new User("juice-resume", "果汁简历", "专注于 Java 方向技术分享");

        // @Builder 生成
        User user = User.builder().id("juice-resume").name("果汁简历").desc("专注于 Java 方向技术分享").build();
    }

    // @SneakyThrows 自动生成 throws FileNotFoundException
    @SneakyThrows
    private void read() {
        // @Cleanup 相当于 inputStream.close();
        @Cleanup
        InputStream inputStream = new FileInputStream("");
    }

    /**
     * @Synchronized private final Object $lock = new Object[0];
     * public void write() {
     * synchronized(this.$lock) {
     * System.out.println("write");
     * }
     * }
     */

    @Synchronized
    public void write() {
        System.out.println("write");
    }
}

编写脚本

为了不影响原有的项目结构,同时还能保留反编译前的内容,所有我直接重命名 srcsrc-lombok,然后再从src-lomboksrc进行反编译,脚本如下

mv src src-lombok
java -jar lombok.jar delombok lombok-src -d src

运行脚本

运行脚本,然后检查目录

sh delombok.sh

运行命令以后我们可以检查结果,所有文件都被复制,但是User.java 文件被“反编译”了,如下

// Generated by delombok at Fri Jul 10 07:52:41 CST 2020
package com.github.juice.resume;

import lombok.*;
import java.io.FileInputStream;
import java.io.InputStream;

public class User {
    // @NoArgsConstructor 生成
    // @AllArgsConstructor 生成
    // @Builder 生成
    // @SneakyThrows 自动生成 throws FileNotFoundException
    // @Cleanup 相当于 inputStream.close();
    @java.lang.SuppressWarnings("all")
    private final java.lang.Object $lock = new java.lang.Object[0];
    private String id;
    private String name;
    private String desc;

    public static void main(String[] args) {
        new User();
        new User("juice-resume", "果汁简历", "专注于 Java 方向技术分享");
        User user = User.builder().id("juice-resume").name("果汁简历").desc("专注于 Java 方向技术分享").build();
    }

    private void read() {
        try {
            InputStream inputStream = new FileInputStream("");
            try {
            } finally {
                if (java.util.Collections.singletonList(inputStream).get(0) != null) {
                    inputStream.close();
                }
            }
        } catch (final java.lang.Throwable $ex) {
            throw lombok.Lombok.sneakyThrow($ex);
        }
    }

    /**
     * @Synchronized private final Object $lock = new Object[0];
     * public void write() {
     * synchronized(this.$lock) {
     * System.out.println("write");
     * }
     * }
     */
    public void write() {
        synchronized (this.$lock) {
            System.out.println("write");
        }
    }


    @java.lang.SuppressWarnings("all")
    public static class UserBuilder {
        @java.lang.SuppressWarnings("all")
        private String id;
        @java.lang.SuppressWarnings("all")
        private String name;
        @java.lang.SuppressWarnings("all")
        private String desc;

        @java.lang.SuppressWarnings("all")
        UserBuilder() {
        }

        @java.lang.SuppressWarnings("all")
        public User.UserBuilder id(final String id) {
            this.id = id;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public User.UserBuilder name(final String name) {
            this.name = name;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public User.UserBuilder desc(final String desc) {
            this.desc = desc;
            return this;
        }

        @java.lang.SuppressWarnings("all")
        public User build() {
            return new User(this.id, this.name, this.desc);
        }

        @java.lang.Override
        @java.lang.SuppressWarnings("all")
        public java.lang.String toString() {
            return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", desc=" + this.desc + ")";
        }
    }

    @java.lang.SuppressWarnings("all")
    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    @java.lang.SuppressWarnings("all")
    public String getId() {
        return this.id;
    }

    @java.lang.SuppressWarnings("all")
    public String getName() {
        return this.name;
    }

    @java.lang.SuppressWarnings("all")
    public String getDesc() {
        return this.desc;
    }

    @java.lang.SuppressWarnings("all")
    public void setId(final String id) {
        this.id = id;
    }

    @java.lang.SuppressWarnings("all")
    public void setName(final String name) {
        this.name = name;
    }

    @java.lang.SuppressWarnings("all")
    public void setDesc(final String desc) {
        this.desc = desc;
    }

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    public boolean equals(final java.lang.Object o) {
        if (o == this) return true;
        if (!(o instanceof User)) return false;
        final User other = (User) o;
        if (!other.canEqual((java.lang.Object) this)) return false;
        final java.lang.Object this$id = this.getId();
        final java.lang.Object other$id = other.getId();
        if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false;
        final java.lang.Object this$name = this.getName();
        final java.lang.Object other$name = other.getName();
        if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
        final java.lang.Object this$desc = this.getDesc();
        final java.lang.Object other$desc = other.getDesc();
        if (this$desc == null ? other$desc != null : !this$desc.equals(other$desc)) return false;
        return true;
    }

    @java.lang.SuppressWarnings("all")
    protected boolean canEqual(final java.lang.Object other) {
        return other instanceof User;
    }

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final java.lang.Object $id = this.getId();
        result = result * PRIME + ($id == null ? 43 : $id.hashCode());
        final java.lang.Object $name = this.getName();
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        final java.lang.Object $desc = this.getDesc();
        result = result * PRIME + ($desc == null ? 43 : $desc.hashCode());
        return result;
    }

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    public java.lang.String toString() {
        return "User(id=" + this.getId() + ", name=" + this.getName() + ", desc=" + this.getDesc() + ")";
    }

    @java.lang.SuppressWarnings("all")
    public User() {
    }

    @java.lang.SuppressWarnings("all")
    public User(final String id, final String name, final String desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }
}

OK,你get到了吗?

你可能感兴趣的:(开发与辅助工具)