【发布时间】:2018-05-23 16:37:19
【问题描述】:
我写了一个注解处理器,它为我的类生成一个构建器类,用@DataBuilder注解
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class DataBuilder
我用这个注释注释的类位于com.my.package.model包中,生成的构建器类也位于同一包中com.my.package.model但在生成目录中当然build/generated/source/kapt/debug/com/my/package/model/MyModelBuilder.kt,我可以很好地使用这些生成的类在我的模型类中(用 Kotlin 编写)
但是我可以不在 java 类中使用生成的 MyModelBuilder Kotlin 类作为类成员
package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
MyModelBuilder builder; // <=== AS recognizes the class, but I'm having an compilation issue
}
Android Studio 可以识别该类,但我遇到了这个编译问题
com/my/package/home/Home.java:4: error: cannot find symbol
MyModelBuilder builder;
^
symbol: class MyModelBuilder
location: class Home
这很奇怪,因为我只能在方法内部使用这个生成的构建器类,这段代码编译得很好:
package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
public void hello() {
MyModelBuilder builder;
}
}
这里有人可以帮助我理解这种行为以及如何解决这个问题吗?提前谢谢!
更新
我刚刚使用必要的代码创建了这个 repo 来复制问题 https://github.com/epool/HelloKapt
克隆并运行后项目运行良好,若要复制此问题,请取消注释此行https://github.com/epool/HelloKapt/blob/master/app/src/main/java/com/nearsoft/hellokapt/app/MainActivity.java#L13
注意:如果我将 MainActivity.java 类转换为 Kotlin(MainActivity.kt),则问题无法重现且工作正常,但由于目前的一些项目限制,我不想这样做
【问题讨论】:
-
源码是在哪里生成的,目录是添加到源码集中的吗?
-
@EpicPandaForce 生成的源在
...build/generated/source/kapt/debug/...它与匕首和其他注释处理器使用的目录相同,我的Android Studio 识别生成的类,我可以在方法中使用该类,但不能作为班级成员。
标签: java kotlin kapt annotation-processor kotlinpoet