前言
如果需要将.java文件动态载入当前项目,直接javac编译后,再利用ClassLoader加载即可,但文件中如果包含使用lombok注解,这将导致文件无法直接被javac编译,这个时候就需要Delombok出场了。
javac直接编译lombok注解类
准备Java源代码字符串
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
如果利用命令javac -cp Person.java编译则会输出:
错误: 无源文件
利用lombok.jar编译lombok.Data注解
jar包下载地址:https://projectlombok.org/download
这个时候需要利用下载的java包执行编译,执行命令:javac -cp lombok.jar Person.java
输出编译后的类
public class Person {
private String name;
private int age;
public Person() {
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void setName(String var1) {
this.name = var1;
}
public void setAge(int var1) {
this.age = var1;
}
public boolean equals(Object var1) {
if (var1 == this) {
return true;
} else if (!(var1 instanceof Person)) {
return false;
} else {
Person var2 = (Person)var1;
if (!var2.canEqual(this)) {
return false;
} else if (this.getAge() != var2.getAge()) {
return false;
} else {
String var3 = this.getName();
String var4 = var2.getName();
if (var3 == null) {
if (var4 != null) {
return false;
}
} else if (!var3.equals(var4)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object var1) {
return var1 instanceof Person;
}
public int hashCode() {
int var1 = 1;
var1 = var1 * 59 + this.getAge();
String var2 = this.getName();
var1 = var1 * 59 + (var2 == null ? 43 : var2.hashCode());
return var1;
}
public String toString() {
String var10000 = this.getName();
return "Person(name=" + var10000 + ", age=" + this.getAge() + ")";
}
}
利用Delombok输入编译后的文本
通过执行命令:java -jar lombok.jar delombok -p Person.java > Person.txt,直接输出编译后内容到文本文件Person.txt
// Generated by delombok at Sun Mar 26 23:38:18 CST 2023
public class Person {
private String name;
private int age;
@java.lang.SuppressWarnings("all")
public Person() {
}
@java.lang.SuppressWarnings("all")
public String getName() {
return this.name;
}
@java.lang.SuppressWarnings("all")
public int getAge() {
return this.age;
}
@java.lang.SuppressWarnings("all")
public void setName(final String name) {
this.name = name;
}
@java.lang.SuppressWarnings("all")
public void setAge(final int age) {
this.age = age;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public boolean equals(final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof Person)) return false;
final Person other = (Person) o;
if (!other.canEqual((java.lang.Object) this)) return false;
if (this.getAge() != other.getAge()) 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;
return true;
}
@java.lang.SuppressWarnings("all")
protected boolean canEqual(final java.lang.Object other) {
return other instanceof Person;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.getAge();
final java.lang.Object $name = this.getName();
result = result * PRIME + ($name == null ? 43 : $name.hashCode());
return result;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public java.lang.String toString() {
return "Person(name=" + this.getName() + ", age=" + this.getAge() + ")";
}
}
总结
拿到编译后的类信息或Class文件,就可通过ClassLoader加载到项目中。