Что делаешь? Ломбок

Java

01. Представление Ломбока

LombokВот как я представляю себя на официальном сайте:

Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

Честно говоря, мой английский не очень хорош (не оправдываясь, правда), но с помощью Kingsoft PowerWord я примерно знаю значение этого английского:LombokХорошая библиотека для добавления некоторых «обработчиков» в код Java, чтобы сделать его более кратким и элегантным.

Из моего опыта,LombokСамым большим преимуществом является упрощение кода Java в виде аннотаций. Насколько это упрощено?

Я считаю, что вы, должно быть, написали многоgetter / setter, хотя он может быть сгенерирован автоматически с помощью IDE, как толькоJavabeanЕсть много атрибутов, неизбежно генерировать большое количествоgetter / setter, из-за чего код будет выглядеть менее лаконичным, вонючим и длинным, как старушечьи бинты.

class Cmower {
	private int age;
	private String name;
	private BigDecimal money;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BigDecimal getMoney() {
		return money;
	}

	public void setMoney(BigDecimal money) {
		this.money = money;
	}
}

LombokОн может быть автоматически скомпилирован во время компиляции с помощью аннотаций.Javabeanгенерация свойствgetter / setter, не только это, но также может генерировать конструкторы,equals,hashCode,а такжеtoString. Обратите внимание, что при компиляции в исходном коде нет источникаgetter / setterи так далее.

@Getter
@Setter
class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;
}

Черт возьми, исходный код выглядит намного тоньше, верно?

02. Добавьте зависимости Lombok

Если в проекте используетсяMavenДля сборки добавьтеLombokЗависимость становится легкой.

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.6</version>
	<scope>provided</scope>
</dependency>

вscope=provided, это значитLombokВступает в силу только на этапе компиляции. Это,Lombokмолча принесетLombokАннотированные исходные файлы правильно скомпилированы как полныеclassдокумент.

Напоминание: добавлять только в проектеLombokЗависимостей не хватает, но и добавить в IDELombokподдержка, иначеJavabeanизgetter / setterОн не может быть автоматически скомпилирован и не может быть вызван.

03. Добавьте поддержку Lombok в Eclipse

Первый шаг, скачатьLombokбаночный пакет. Адрес загрузки следующий:

Central.maven.org/maven2/org/…

Второй шаг, дважды щелкните, чтобы запустить пакет jar.

Третий шаг, нажмите «Установить / Обновить» для установки.

Четвертый шаг — перезапустить Eclipse, чтобы завершить перекомпиляцию проекта.

Вы можете просмотреть скомпилированную версию в представлении Outline.getter / setter. Это потрясающе?

В этот момент мы можем использоватьLombokаннотированныйJavabean.

04. Используйте Jad для просмотра байт-кода Lombok

Было время, когда всеми любимыми инструментами для декомпиляции былиJad. Несмотря на то чтоJadУмер и больше не обновляется, но все равно многим нужен. Я, например, один из них. даже в моем уме,Jadлучший инструмент для декомпиляции JavaJD-GUIДо.

Адрес загрузки Jad выглядит следующим образом, включая версии для различных платформ:www.javadecompilers.com/jad

После завершения загрузки разархивируйте его, и никаких действий по установке не требуется. Как использовать Джада?

jad CmowerLombok.class
// Parsing CmowerLombok.class... Generating CmowerLombok.jad

После выполнения вышеуказанной команды будет сгенерирован новый файл с расширением .jad.После открытия его в текстовом редакторе содержимое будет следующим:

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   CmowerLombok.java

package com.cmower.java_demo.lombok;

import java.math.BigDecimal;

class CmowerLombok
{

    CmowerLombok()
    {
    }

    public int getAge()
    {
        return age;
    }

    public String getName()
    {
        return name;
    }

    public BigDecimal getMoney()
    {
        return money;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void setMoney(BigDecimal money)
    {
        this.money = money;
    }

    private int age;
    private String name;
    private BigDecimal money;
}

эй, конечно жеgetter / setterБыло так радостно находиться там, так счастливо, что я ударил ладонью по столу и чуть не сломал руку, и я не знаю, болит стол или нет.

Мой друг посоветовал мне использоватьLombok, но я всегда чувствовал, что добавление библиотеки классов, которая могла бы создавать код, который могла бы легко создать любая современная IDE, не имела большого смысла (предложения немного длинные, будьте осторожны с разрывом предложений). Теперь я так больше не чувствую,LombokСэкономил мне много времени на создание стандартного кода.

PS: Следует отметить, что когда я впервые проверил файл класса, я столкнулся с огромной ямой.getter / setterОн не входит в их число, но его можно назвать. Перепробовал много инструментов для декомпиляции - безрезультатно.

Так что мне пришлось инициировать консультации во многих группах, и многие боги спрашивали совета.Окончательный вывод был, что может быть ошибка в плагине Eclipse Lombok. С этой целью я также скачал средство разработки программиста — IntelliJ IDEA, но использовал его неуверенно и в конце концов сдался.

После метаний около 3 часов у меня не было другого выбора, кроме как перезапустить Eclipse (окончательный убийца для решения проблемы компиляции), и файл класса необъяснимым образом снова появился.getter / setter(Помните, как я взволнованно хлопал по столу?). Вывод, который я делаю из этого, состоит в том, что независимо от того, пишет ли кто-то другойLombokучебник, вы должны практиковать его самостоятельно.

05. Используйте другие инструменты декомпиляции для просмотра байт-кода Lombok

Теперь, когда мы говорим об инструментах декомпиляции, я думаю, необходимо представить еще один отличный инструмент декомпиляции ——Enhanced Class Decompiler.

будетJD,Jad,FernFlow,CFR,ProcyonиEclipseПолная интеграция и позволяет разработчикам Java отлаживать файлы классов напрямую без исходного кода. И это еще не все, он также интегрирует плагин M2E редактора классов Eclipse с поддержкой Javadoc, поиском ссылок, подключением источника библиотеки, просмотром байт-кода иJDK 8 lambdaСинтаксис выражения.

Короче,Enhanced Class DecompilerЗанять место Джада в моем сознании.

Первый шаг, вEclipse MarketplaceНайдите Джада.

Второй шаг, непосредственно нажмите кнопку «Установлено» для установки. Перезапустите Eclipse после завершения установки.

Третий шаг, щелкните правой кнопкой мыши цель, выберите «Показать в представлении удаленных систем».

Четвертый шаг: щелкните правой кнопкой мыши файл класса для просмотра и выберите «Открыть с помощью» → «Просмотр декомпилятора классов» по ​​очереди.

См. декомпилированный код, как показано ниже.

package com.cmower.java_demo.lombok;

import java.math.BigDecimal;

class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;

	public int getAge() {
		return this.age;
	}

	public String getName() {
		return this.name;
	}

	public BigDecimal getMoney() {
		return this.money;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setMoney(BigDecimal money) {
		this.money = money;
	}
}

PS: если вы хотите поставитьEnhanced Class DecompilerЕсли он установлен в качестве представления файла класса по умолчанию, вы можете обратиться к следующему рисунку.

06. Общие аннотации Ломбока

1)@Getter / @Setter

@Getter / @SetterЕго очень гибко использовать, например, как показано ниже:

class CmowerLombok {
	@Getter @Setter private int age;
	@Getter private String name;
	@Setter private BigDecimal money;
}

Декомпилированное содержимое файла байт-кода:

class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;

	public int getAge() {
		return this.age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return this.name;
	}

	public void setMoney(BigDecimal money) {
		this.money = money;
	}
}

2)@ToString

Хороший помощник для печати журналов.

@ToString
class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;
}

Декомпилированное содержимое файла байт-кода:

class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;

	public String toString() {
		return "CmowerLombok(age=" + this.age + ", name=" + this.name + ", money=" + this.money + ")";
	}
}

3)val

При написании кода JavaScript я всегда чувствуюvarЭтот тип объявления переменных особенно удобен в использовании.LombokПредусмотрен и аналогичный.

class CmowerLombok {
	public void test() {
		val names = new ArrayList<String>();
		names.add("沉默王二");
		val name = names.get(0);
		System.out.println(name);
	}
}

Декомпилированное содержимое файла байт-кода:

class CmowerLombok {
	public void test() {
		ArrayList<String> names = new ArrayList();
		names.add("沉默王二");
		String name = (String) names.get(0);
		System.out.println(name);
	}
}

4)@Data

Аннотация @Data может генерироватьgetter / setter,equals,hashCode,а такжеtoString, представляет собой сумму опций.

@Data
class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;
}

Декомпилированное содержимое файла байт-кода:

class CmowerLombok {
	private int age;
	private String name;
	private BigDecimal money;

	public int getAge() {
		return this.age;
	}

	public String getName() {
		return this.name;
	}

	public BigDecimal getMoney() {
		return this.money;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setMoney(BigDecimal money) {
		this.money = money;
	}

	public boolean equals(Object o) {
		if (o == this) {
			return true;
		} else if (!(o instanceof CmowerLombok)) {
			return false;
		} else {
			CmowerLombok other = (CmowerLombok) o;
			if (!other.canEqual(this)) {
				return false;
			} else if (this.getAge() != other.getAge()) {
				return false;
			} else {
				Object this$name = this.getName();
				Object other$name = other.getName();
				if (this$name == null) {
					if (other$name != null) {
						return false;
					}
				} else if (!this$name.equals(other$name)) {
					return false;
				}

				Object this$money = this.getMoney();
				Object other$money = other.getMoney();
				if (this$money == null) {
					if (other$money != null) {
						return false;
					}
				} else if (!this$money.equals(other$money)) {
					return false;
				}

				return true;
			}
		}
	}

	protected boolean canEqual(Object other) {
		return other instanceof CmowerLombok;
	}

	public int hashCode() {
		int PRIME = true;
		int result = 1;
		int result = result * 59 + this.getAge();
		Object $name = this.getName();
		result = result * 59 + ($name == null ? 43 : $name.hashCode());
		Object $money = this.getMoney();
		result = result * 59 + ($money == null ? 43 : $money.hashCode());
		return result;
	}

	public String toString() {
		return "CmowerLombok(age=" + this.getAge() + ", name=" + this.getName() + ", money=" + this.getMoney() + ")";
	}
}

5) ЕщеLombokАннотация, ждет вас, чтобы разблокировать.

07. Поток обработки Ломбока

Картинка стоит тысячи слов, поэтому я начну с картинки.

  • javac анализирует исходный код и создает абстрактное синтаксическое дерево (AST)

  • Программа Lombok, реализующая JSR 269, вызывается во время компиляции javac.

  • Lombok обрабатывает AST, находит синтаксическое дерево (AST), соответствующее классу, в котором находится аннотация Lombok, а затем модифицирует синтаксическое дерево, добавляя соответствующий узел дерева (так называемый код), определенный аннотацией Lombok.

  • javac генерирует файлы байт-кода, используя модифицированные абстрактные синтаксические деревья.