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 генерирует файлы байт-кода, используя модифицированные абстрактные синтаксические деревья.