Lombok getters/setters 在我的注解处理器中不可见
Lombok getters/setters are not visible from my annotation processor
我对 javax.annotation.processing.AbstractProcessor
进行了自定义实现,并且它有效。
但是我的处理器没有找到由 Lombok 生成的 getters、setters 和构造函数。
这是我的proceesor(我需要创建最小的例子吗?):
https://github.com/hohserg1/ElegantNetworking/blob/1.12.2-annotation-processor/src/main/java/hohserg/elegant/networking/annotation/processor/ElegantPacketProcessor.java#L62
示例class:
ElegantPacket //my
@Value //lombok
public class Test implements ClientToServerPacket {
int some; //it visible
//int getSome() //generated by Lombok, it invisible
//public Test(int some) //generated by Lombok, it invisible
}
如果您希望 运行 Lombok 和另一个注释处理器,那么您应该 delombok 您的代码和 运行 您的注释处理器的结果。
这就是Checker Framework Gradle Plugin does, as explained in the Checker Framework Manual。
解释:
大多数注释处理器要么产生输出(例如,发出警告),要么生成新的 类。 Lombok 是修改现有代码的注解处理器。它通过访问 javac
编译器(它也支持 eclipsec
)的内部 API 来实现。这些操作导致 javac
发出字节码,其中包含 Lombok 对您的 类 的更改。但是,这些更改对于编译器的早期阶段是不可见的,尤其是您的注释处理器。换句话说,Lombok 不能很好地与其他注释处理器配合使用。
好的,我通过使用 gradle 依赖配置的 annotationProcessor
来解决这个问题:
dependencies {
//gradle 4.6+
annotationProcessor 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.8"
...
}
也不是所有的 lombok 更改仍然可以从我的注释处理器中看到。字段访问修饰符的变化是不可见的,但可以从 lombok 注释中确定。例如,@Value 将包私有字段设为私有。
插件 apt 也可用于 gradle 小于 4.6
buildscript {
repositories {
...
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
...
classpath 'net.ltgt.gradle:gradle-apt-plugin:0.9'
}
}
dependencies {
apt 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.7"
...
}
我对 javax.annotation.processing.AbstractProcessor
进行了自定义实现,并且它有效。
但是我的处理器没有找到由 Lombok 生成的 getters、setters 和构造函数。
这是我的proceesor(我需要创建最小的例子吗?): https://github.com/hohserg1/ElegantNetworking/blob/1.12.2-annotation-processor/src/main/java/hohserg/elegant/networking/annotation/processor/ElegantPacketProcessor.java#L62
示例class:
ElegantPacket //my
@Value //lombok
public class Test implements ClientToServerPacket {
int some; //it visible
//int getSome() //generated by Lombok, it invisible
//public Test(int some) //generated by Lombok, it invisible
}
如果您希望 运行 Lombok 和另一个注释处理器,那么您应该 delombok 您的代码和 运行 您的注释处理器的结果。
这就是Checker Framework Gradle Plugin does, as explained in the Checker Framework Manual。
解释:
大多数注释处理器要么产生输出(例如,发出警告),要么生成新的 类。 Lombok 是修改现有代码的注解处理器。它通过访问 javac
编译器(它也支持 eclipsec
)的内部 API 来实现。这些操作导致 javac
发出字节码,其中包含 Lombok 对您的 类 的更改。但是,这些更改对于编译器的早期阶段是不可见的,尤其是您的注释处理器。换句话说,Lombok 不能很好地与其他注释处理器配合使用。
好的,我通过使用 gradle 依赖配置的 annotationProcessor
来解决这个问题:
dependencies {
//gradle 4.6+
annotationProcessor 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.8"
...
}
也不是所有的 lombok 更改仍然可以从我的注释处理器中看到。字段访问修饰符的变化是不可见的,但可以从 lombok 注释中确定。例如,@Value 将包私有字段设为私有。
插件 apt 也可用于 gradle 小于 4.6
buildscript {
repositories {
...
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
...
classpath 'net.ltgt.gradle:gradle-apt-plugin:0.9'
}
}
dependencies {
apt 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.7"
...
}