我想编写自定义Lombok注释处理程序。我知道http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html.但是当前的lombok jar文件并不包含很多内容。类文件,但文件名为。症状自评量表。取而代之的是龙目山。
我发现,的。SCL. lombok文件是. class文件,Lombok的构建脚本在生成jar文件时重命名了它们,ShadowClassLoader能够加载这些类——缩写SCL似乎就是由此而来的。这样做的原因似乎只是为了“避免污染使用基于SCL的jar的任何项目的命名空间”。IDE中的自动完成程序不会建议实际公共API以外的任何东西。"
我只能编译我的自定义处理程序
此外,为了能够使用我的自定义处理程序,我需要创建一个新的fat jar,其中包含lombok类和我的自定义处理程序。自定义lombok类加载器本质上防止在其他多个JAR中添加自定义处理程序。
这是扩展龙目岛的唯一方法吗?还是我错过了什么?
我正在使用以下构建脚本
apply plugin: 'java'
repositories {
jcenter()
}
configurations {
lombok
compileOnly
}
def unpackedAndRenamedLombokDir = file("$buildDir/lombok")
task unpackAndRenameLombok {
inputs.files configurations.lombok
outputs.dir unpackedAndRenamedLombokDir
doFirst {
mkdir unpackedAndRenamedLombokDir
delete unpackedAndRenamedLombokDir.listFiles()
}
doLast {
copy {
from zipTree(configurations.lombok.singleFile)
into unpackedAndRenamedLombokDir
rename "(.*)[.]SCL[.]lombok", '$1.class'
}
}
}
sourceSets {
main {
compileClasspath += configurations.compileOnly
output.dir(unpackedAndRenamedLombokDir, builtBy: unpackAndRenameLombok)
}
}
tasks.compileJava {
dependsOn unpackAndRenameLombok
}
dependencies {
compile files("${System.properties['java.home']}/../lib/tools.jar")
compile "org.eclipse.jdt:org.eclipse.jdt.core:3.10.0"
compile 'javax.inject:javax.inject:1'
lombok 'org.projectlombok:lombok:1.16.6'
compileOnly files(unpackedAndRenamedLombokDir)
}
使用这个问题和另一个答案(由Balder提供)的输入,我们成功地构建了一个定制的Lombok注释处理程序:Symbok。请随意使用它作为编写自己的示例。
顺便说一句,与编写自定义Lombok处理程序不同,您还可以实现一个javac插件——这可能更简单。
与此同时,Reinier Zwitserroot创建了一个新的git分支sclExpansionUpdate,其中包含ShadowClassLoader的更新版本:
ShadowClassLoader现在对尝试扩展lombok更加友好。
您的(单独的)jar/dir应该有一个名为META-INF/ShadowClassLoader的文件。这个文件应该包含字符串'lombok'。如果您有,该jar/dir中的任何类都将加载在与Lombok类相同的空间中。您还可以将类文件重命名为。SCL. lombok以避免其他加载程序找到它们。
我想这还没有进入主分支,因为它肯定没有经过太多测试-我只是自己尝试过,它包含一个小错误,阻止从扩展加载所需的META-INF/服务。要修复它,您应该将对partOfShadow
的两个方法调用替换为inOwnBase
:
[... line 443]
Enumeration<URL> sec = super.getResources(name);
while (sec.hasMoreElements()) {
URL item = sec.nextElement();
if (!inOwnBase(item, name)) vector.add(item); // <<-- HERE
}
if (altName != null) {
Enumeration<URL> tern = super.getResources(altName);
while (tern.hasMoreElements()) {
URL item = tern.nextElement();
if (!inOwnBase(item, altName)) vector.add(item); // <<-- AND HERE
}
}
我用上面的补丁对它进行了测试,它似乎工作得很好(虽然测试不多)。
另一方面:有了这个新的扩展机制,现在终于可以将扩展注释处理程序和注释放在不同于“lombok”的名称空间中了——很好!
问题内容: 我想编写自定义的Lombok注释处理程序。我知道http://notatube.blogspot.de/2010/12/project-lombok- creating-custom.html 。但是当前的lombok jar文件并不包含许多.class文件,而是包含名为.SCL.lombok的文件。 我发现.SCL.lombok文件是.class文件,Lombok的生成脚本在生成ja
下面是Lombok的注释的java文档: 如果加上一个参数,lombok将在方法/构造函数主体的开头插入一个空检查,抛出一个{@code NullPointerException},参数名作为消息。如果放在字段上,任何为该字段赋值的生成方法也将生成这些空检查。请注意,任何名为{@code NonNull}且带有任何大小写和任何包的注释都将导致为生成的方法生成nullchecks(并且注释将被复制到
我在代码中使用Lombok自动生成getter和setter代码。我想添加其他个人注释并使用它。 例如,我想添加一个方法来验证列表中是否存在一个键: 创建注释后,我将执行以下操作:
我使用抽象处理器创建了一个自定义注释和注释处理器。这意味着我想在编译之前进行注释处理。我将自定义注释和处理器导出为Jar,并尝试将其与简单的java测试程序一起使用。我确信在编译时它会找到我的java处理器类,但不知何故,我并没有得到我在控制台上期望的o/p。下面是我的处理器中处理方法的代码。 此外,我故意使用以便我得到一个版本警告,它确认当我执行一个测试类时,它找到了我的注释处理器。 这里是我的
在 imi 框架中,使用注解可以实现很多功能。比如:路由、模型定义、事务、缓存等等 除了内置的注解以外,如果编写属于自己的注解呢? 这篇教程就来教大家来编写属于自己的注解。 注解定义 注解扫描 imi 是常驻内存运行的,所以冷启动时采用了全量扫描的方式,来实现注解缓存。使用的时候,就和读取配置一样简单高效。 一般需要在配置文件里的beanScan中,配置注解类所在命名空间。在 imi 框架中,涉及
问题内容: 我可能只是看错了方向,但我发现有关批注处理的JSE文档非常稀疏。我想编写一个注释处理器,该处理器处理带注释的String字段和局部变量,以计算的String表达式替换它们。这应该不会太复杂,但是我对于Javax.annotation.processing的Javadoc却迷失了。 编辑:我需要在编译时处理批注,因为我想修改生成的代码。它应将带注释的常量String表达式替换为计算的St