当前位置: 首页 > 知识库问答 >
问题:

Kotlin看不到Java Lombok访问器?

齐英朗
2023-03-14

使用Kotlin 1.0.0版本(在IntelliJ 15中编译)。

println(myPojoInstance.foo)

当它试图编译引用基于Lombok的Pojo的代码(在IntelliJ或Gradle中)时,它给出错误“无法访问‘foo’:它在‘MyPojo’中是‘private’。这是真的,它们都是私有的,我的对象有@Value @Builder用于lombok注释。

我已经尝试专门调用getFoo(),但是它显示“getFoo的未解析引用”。也许有一些技巧可以让Kotlin知道如何处理lombok注释?

共有3个答案

易焱
2023-03-14

正如上面评论中提到的,delombok有所帮助。在maven build的情况下,应该是:

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>${lombok.version}.0</version>
    <executions>
        <execution>
            <id>delombok</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
            <configuration>
                <formatPreferences>
                    <javaLangAsFQN>skip</javaLangAsFQN>
                </formatPreferences>
                <verbose>true</verbose>
            </configuration>
        </execution>
        <execution>
            <id>test-delombok</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>testDelombok</goal>
            </goals>
            <configuration>
                <verbose>true</verbose>
            </configuration>
        </execution>
    </executions>
</plugin>
韩乐湛
2023-03-14

有一个lombok的Kotlin编译器插件。它仍然是实验性的,可以与Gradle或Maven一起使用。

它只支持满手的注释,包括

  • @Getter@Setter
  • @noargsconstuctor@RequiredArgsConstructor@allargsconsttructor
  • @Data
  • @With
  • @Value

似乎按预期工作。不幸的是,它们不支持@Builder注释,但您可以请求在YouTrack中添加

有关详细信息,请参阅kotlin留档中的Lombok编译器插件。

上面提到的@Builder注释票证已修复!修复的目标版本是1.8.0-Beta

轩辕季同
2023-03-14

一般来说,不,它没有。这种行为的原因是Lombok是javac的注释处理器,但是当kotlin编译器运行时,它也使用javac,但没有注释处理,所以这就是为什么kotlin看不到尚未生成的声明。

目前唯一的解决方法是定义严格的编译顺序:先Java,然后kotlin。不幸的是,这种方法有很大的缺点:在这种情况下,您不能使用Java中的Kotlin代码。要解决这个问题,您可能需要一个多模块项目,这可能会造成很多痛苦

 类似资料:
  • 不工作的Kotlin代码如下所示: 我省略了(我相信)没有必要重现这个问题的代码。 Kotlin代码实际上是编译的,但在运行时,它在线程“main”java.lang.IllegalAccesserRor中抛出访问类foo.bar.utils.foo$bar$qux。当悬停在上时,IntelliJ显示一个提示,提示中定义了:public/*package*/open class Qux,所以在此上

  • 我正在开发一个使用反射的库,我想操纵给定KClass的所有属性/函数。 使用属性,我可以操作所有可访问的成员(根据留档),即:公共、内部和受保护的字段、属性和函数。但是我看不到私有的。 使用Java反射,我可以使用,同样,我可以看到使用类的私有方法。getDeclaredMethods()。 有没有办法使用kotlin反射API来实现这一点?

  • 问题内容: 我有这段Java代码: 我想在Kotlin中获得MainActivity对象。自动转换在处中断。 问题答案: 您可以通过使用合格的来获得对Kotlin中对象的引用。例如:

  • 问题内容: 是否可以从Java代码访问扩展功能? 我在Kotlin文件中定义了扩展功能。 (生成的)java类在哪里。现在,我想用普通的Java代码访问它: 但是,这不起作用。 IDE无法识别该方法,并且编译失败。 起作用的是与kotlin的静态函数一起使用: 通过使用我的IDE似乎已正确配置。 我从kotlin文档中搜索了整个Java互操作文件,并且在谷歌上搜索了很多,但是找不到。 我究竟做错了

  • 我在Kotlin文件中定义了扩展函数。 其中是(生成的)java类。现在,我想用正常的java代码访问它: 然而,那是行不通的。IDE将无法识别方法,编译失败。