最近在用 kotlin 写 mybatis 时, 报了个 MyBatisSystemException
, 之前用 Java 时好好的,
便查了一下资料, 发现这是 kotlin 使用一些注解和反射的库时普遍遇到的问题,
原因是 data class
是没有无参构造的, 导致利用反射通过无参构造实例化时出错
** 解决办法**:
显然官方早就有了解决方案, 官方文档
通过 noArg
插件在 data class
上使用注解便可生成一个无参构造函数
同时官方也说了, 这个无参构造函数是合成的,不能直接从 Java
或 Kotlin
调用,但可以使用反射调用
annotation class NoArg
build.gradle
添加插件, 版本号改成项目中 kotlin 对应的版本就行
plugins {
id "org.jetbrains.kotlin.plugin.noarg" version "1.9.10"
}
build.gradle
最外层添加如下内容
noArg {
invokeInitializers = true
annotation("com.my.NoArg") // 换成您的注解类的完整路径
}
@NoArg
data class User (
val username: String,
)
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- Or "jpa" for JPA support -->
<plugin>no-arg</plugin>
</compilerPlugins>
<pluginOptions>
<!-- 换成您的注解类的完整路径 -->
<option>no-arg:annotation=com.my.Annotation</option>
<!-- Call instance initializers in the synthetic constructor -->
<!-- <option>no-arg:invokeInitializers=true</option> -->
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
有一些框架例如 Spring AOP
, 要求 Java 类是 public 的 / kotlin 是 open 的
(kotlin-spring
可以自动 all-open)
annotation class AllOpen
build.gradle
添加插件, 版本号改成项目中 kotlin 对应的版本就行
plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "1.9.10"
}
build.gradle
最外层添加如下内容
allOpen {
annotation("com.my.AllOpen") // 换成您的注解类的完整路径
}
@AllOpen
, 其子类也有效)
@AllOpen
data class User (
val username: String,
)
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- Or "spring" for the Spring support -->
<plugin>all-open</plugin>
</compilerPlugins>
<pluginOptions>
<!-- 换成您的注解类的完整路径 -->
<option>all-open:annotation=com.my.Annotation</option>
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>