首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有.SCL.lombok扩展名的文件

具有.SCL.lombok扩展名的文件
EN

Stack Overflow用户
提问于 2022-05-09 13:45:46
回答 1查看 111关注 0票数 2

当在Intellij中打开lombok文件时,除注释之外的所有文件都以.SCL.lombok结尾(例如,HandleAccessors.SCL.lombok)。我只是想知道这是什么原因以及它是如何处理的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-09 14:16:01

其原因

Lombok有一个公共API --你应该与之交互的东西。例如,这就是@lombok.Getter注释。这些只是jar中的类文件,其目的很简单:将jar添加到类路径中,IDE自动完成对话框等将根据设计自动开始提示这些内容。

但是,lombok也有很多课程只是“让它运转”,这些课程并不适合公众消费。比如lombok.eclipse.HandleGetter,它是在eclipse代理中处理@Getter注释的实现。在任何项目中,在任何地方引用这个类都没有意义或目的--这是一个内部的lombok问题。如果我们将jar文件插入jar中,然后键入Handle并按下IDE的自动完成快捷键,您仍然会得到建议。

类似地,我们直接将一些依赖项传送到lombok.jar中--它是一个“阴影jar”(一个包含所有ship的jar),尽管我们没有这么多,使lombok.jar保持了一个很小的大小。尽管如此,ASM (字节码操作库)仍然在其中,这是相当流行的。

大多数阴影工具提供的标准阴影解决方案是在名称后面加上某物的前缀。ASM的org.objectweb.asm.AnnotationVisitor类将成为org.projectlombok.shading.org.objectweb.asm.AnnotationVisitor。重点是,您的IDE不知道这一点,如果您在您的项目中也使用了asm (其中您也使用了lombok),并且您希望AnnotationVisitor --因此您输入了AnnV并点击cmd+space之类的--那么您的IDE建议两者兼而有之。这太丑了,我们想避免这件事。

因此,我们构建了自己的着色器,它的工作原理是首先没有类文件。这样,IDE和任何其他自动化工具甚至都不知道我们的ASM类,或者我们的实现细节。这些工具(例如IDE)看到的唯一文件是您想要看到的类型:lombok.Builderlombok.extern.slf4j.Slf4jlombok.experimental.UtilityClass等等。

它怎麽工作

Java的类加载器体系结构是抽象的:您可以自己创建。类加载器提供的原语很简单:“将包含字节码的字节数组(即类文件的内容)转换为Class<?>定义”,在编写自己的类加载程序时应该实现的原语有两个:

这里的

  • 是一个资源密钥,如"/com/foo/load.png“。请向我提供一个InputStream,其中包含这些数据。
  • 在这里是一个完全限定的类名,例如"com.foo.MyApp“。请向我提供一个表示它的Class<?>实例.

java提供了默认的类加载器。这个默认的类加载程序通过检查您的CLASSPATH来回答这些问题--可以通过各种方式(通过jar清单的类路径条目,或者通过-cp参数到JVM可执行文件,或者通过CLASSPATH环境变量)来提供,并扫描类路径上的每个条目以查找所请求的资源,从而能够读取文件系统并打开jar文件。

但这只是一个,一个类加载器。java中一般原则的一个实现。你可以自己写。您可以编写一个类加载器,它可以动态生成资源,也可以从网络加载资源。

或者,就像lombok一样,通过打开自己的jar并查找.SCL.lombok文件来加载它们。

因此,lombok的工作方式是这样的:当您启动它时,' entrypoint‘(包含public static void main的类--或者在lombok的例子中是这样,对于javac模式是注释处理器入口点,对于eclipse是agentmain),我们使用一些花哨的诡计来“隐藏”它: agentmain不需要在public类中(不能是.SCL.lombok文件--我们的类加载程序还没有可用,我们需要先引导它!)注释处理器确实必须在一个公共类中,但是,它是包私有类中的一个公共类,因此,几乎每个IDE都知道它是“不可见的”,并且不会显示它,但是javac的注释运行程序接受它。

在那里,我们注册了一个类加载器,它能够通过读取.SCL.lombok文件来加载类,这使我们能够隐藏我们想要隐藏的所有其他内容。

我想开发lombok,这会阻碍我的发展!

没有必要,只需克隆我们的回购,运行ant eclipseant intellij,然后你就可以走了。没有第一次分叉就无法扩展lombok;我们希望lombok能够在没有lombok的情况下进行扩展,但这比不做.SCL.lombok要复杂得多。Eclipse运行在春分之上,这是一种运行时模块化系统,要使它正常工作需要各种东西,这使得“在类路径上抛出一些额外的处理程序”从一开始就不是扩展lombok的可行途径。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72173016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档