Tag: 注释

kapt:如何处理测试资源?

我有一个使用kapt进行注释处理和代码生成的项目(基于注释)。 它在主要来源工作,但不在测试来源。 有些来源(例如如何在androidTest范围中使用kapt )建议运行gradle kaptTest ,但是这也不起作用。 它将任务报告为“最新”,甚至在清理干净之后。 也许这个建议是唯一的android。 我从https://github.com/JetBrains/kotlin-examples/tree/master/gradle/kotlin-code-generation下载了示例项目,在测试源中添加了一个注释用法,我在那里得到了相同的行为。 它适用于主要来源,不适用于测试来源。 输出中唯一奇怪的是: > Task :example:compileKotlin Using kotlin incremental compilation w: [kapt] Sources output directory is not specified, skipping annotation processing 但是正如你所看到的,这不是测试来源,而是主要来源,而注释处理器就是应用在那些上。 我在注释处理器中添加了一个打印输出。 它显示为compileKotlin,但不是compileTestKotlin。 那么,使kapt在测试源上工作的魔术是什么? PS:我想有人会问我的build.gradle。 这与我链接的例子是一样的,所以如果你能使它适用于这个例子,我可以集成到我的构建文件中。 PPS:我发现只有类似的问题是Kotlin的kapt插件for gradle不能用于自定义源集(JMH) ,他们建议发布一个bug报告。 所以也许这是kapt-gradle-plugin中的一个bug?

在Kotlin中枚举注释

我有一个由Gson序列化/反序列化的枚举: enum class PacketType { NONE; [SerializedName(“request”)] REQUEST; [SerializedName(“response”)] RESPONSE; [SerializedName(“event”)] EVENT; } 不幸的是,我注意到Gson忽略了SerializedName注解,并使用枚举值的大写名称。 我决定找出为什么序列化不能按预期工作,并发现Kotlin删除枚举值的所有注释。 我怎样才能使这些注释出现在生成的字节码?

在Kotlin嵌套注释

在Java中,可以创建如下所示的嵌套注释: public @interface InnerInnotation { String value(); } public @interface OuterAnnotation { InnerAnnotation[] value() default { @InnerAnnotation(“Hello”), @InnerAnnotation(“World”) } } annotation class InnerAnnotation(val value: String) 但是当我试图在Kotlin中做同样的事情时,我得到一个编译错误: annotation class OuterAnnotation( // Next line doesn’t compile: “Annotation class cannot be instantiated” val value: Array = arrayOf(InnerAnnotation(“Test”)) ) 但是,单个实例注记字段正常工作: annotation class OuterAnnotation( val value: InnerAnnotation = InnerAnnotation(“Hello World”) […]

如何使IDE明白,方法调用后该对象完全不为null

我正在使用Kotlin语言的Android工作室 当我调用上面的函数,它的警告检查“obj”的空状态 如何使IDE(Android Studio)能够理解在某些方法调用之后,(传递的)对象完全不为空…谢谢

Kotlinreflection无法访问使用网站的目标注释

我使用注释网站目标@get困惑了我一会儿。 class GetSiteTarget1(@get:Annotation val value: Int = 1); class GetSiteTarget2 { val value = 1 @Annotation get () { return field; } }; 上面两个类都有不同的结果: GetSiteTarget1::value.getter.annotations; // not has @Annotation GetSiteTarget1::value.getter.javaMethod!!.annotations // has @Annotation GetSiteTarget2::value.getter.annotations; // has @Annotation GetSiteTarget2::value.getter.javaMethod!!.annotations // has @Annotation 而且这两个类都用@Annotation注解: RuntimeVisibleAnnotations: 0: #10() // @Annotation 谁能告诉我为什么?

如何在Kotlin中列出字段注释?

我有一个注释 public @interface Field { String value(); } 和java类,由它注释: public class Animal { @Field(“name”) private String name; } 我尝试通过下一个代码列出所有字段的注释: for(field in clazz.declaredFields){ for(annotation in field.annotations){ when(annotation){ is Field -> { //do something } } } } 其中clazz是Class 但是field.annotations是空的。 如何正确列出注释?

Kotlin可重复@annotations不能在jdk-8上工作

我已经在@Parameter中声明了一个可重复的注解 kotlin如下: @Repeatable annotation class Parameter(val name: String); 但是当我如下所示使用它时,编译器会报告一个错误: 1.8之前的JVM版本只能重复带有源保留的注释 @Parameter(“foo”) @Parameter(“bar”) fun repeat() = 1; 我确定我正在使用jdk-8 kotlin 。 而对于kotlin-1.1.2 gradle插件,选项jvmTarget也被设置为1.8 。 问:为什么它不能正常工作? sourceCompatibility = 1.8 targetCompatibility = 1.8 compileKotlin { kotlinOptions{ jvmTarget = “1.8” } }

我可以从命令行或从Ant调用Kotlin noargs插件吗?

Kotlin有一个noarg编译器插件 ,可以用来为特殊注释类生成合成的无参数构造函数。 文档页面清楚地解释了如何在Maven和Gradle中使用它,但是不清楚它是否可以使用,或者如何使用它,无论是从Ant还是在命令行中使用kotlinc 。 到目前为止,我一直无法做到这一点。 这是我的NoArgs.kt源文件: package test annotation class NoArgs @NoArgs data class Test(val x: String, val y: String) 以下是我尝试过的一些命令行,根本没有任何作用: $ kotlinc -verbose “-Xplugin:$KOTLIN_HOME/lib/noarg-compiler-plugin.jar -P plugin:org.jetbrains.kotlin.noarg:annotation=test.NoArgs NoArgs.kt 和: $ kotlinc -verbose “-Xplugin=$KOTLIN_HOME/lib/kotlin-annotation-processing.jar;$KOTLIN_HOME/lib/noarg-compiler-plugin.jar;$JRE_HOME/lib/tools.jar” -P plugin:org.jetbrains.kotlin.noarg:annotation=test.NoArgs NoArgs.kt 当我运行$ javap test.Test ,没有生成无参数构造函数的证据。 还有一些证据表明,插件并没有运行,事实上,如果我把垃圾,而不是-P选项的单词注释 ,没有错误信息或行为改变。 如果你能告诉我如何使用kotlinc或Ant来运行它,我真的很感激它!

注释处理器生成文件,但无法在应用程序中访问它们(mainActivity)

这里是我的示例项目https://github.com/ilagarwal/uclego ,我使用Kotlin注释生成文件。 注释名称是: DSLAnnotation 。 是类注解并生成另一个类名称在路径uclego/uclegodemo/app/build/tmp/kapt/debug/kotlinGenerated/$package/*生成$ class。 我用DSL.kt在应用程序模块中注释了DSL.kt ,并在上面的路径中生成了一个文件。 但是,当试图在应用程序中使用它说没有find文件。 项目中有4个lib模块可以完成以下工作 processor :包含注释处理器 api :定义注释类 app :使用注释 uclego :只是提供一些静态方法的中间 有人可以帮我解决这个项目出了什么问题。

在Kotlin中使用@Annotation和有什么区别?

例如 class LoggingService [Inject] (protected val logger: Logger) class LoggingService @Inject (protected val logger: Logger) 我在官方文档中没有发现任何东西。