问题
kotlin的类以及成员默认都是final的,因此不能继承final类或者重写final方法,这对于 如 Spring AOP这类大量使用cglib代理实现的框架 很不方便;
当然可以显示声明类或者成员方法为open类型;另一种更为优雅的方式是通过kotlin提供的kotlin-spring 插件即可实现 All-open
通过插件满足 All-open
对于Spring的友好支持
如果你的框架正好是spring, 那么可以直接使用kotlin-spring 插件来完成,更加方便
Gradle
1、可以通过添加 build script dependencies:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: "kotlin-spring" // instead of "kotlin-allopen"
2、也可以直接使用Gradle plugins DSL:
plugins {
id "org.jetbrains.kotlin.plugin.spring" version "1.4.32"
}
Maven
kotlin-maven-allopen插件依赖提供了Spring插件支持,因此直接使用即可
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
对于非Spring也同样提供支持
当然,对于非spring框架也可以自己指定特定的注解 让其生效
Gradle
1、通过添加 build script dependencies
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: "kotlin-allopen"
2、也可以通过
plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "1.4.32"
}
然后指定生效的注解:
allOpen {
annotation("com.my.Annotation")
// annotations("com.another.Annotation", "com.third.Annotation")
}
这样被注解 com.my.Annotation标注后,类及成员都会被处理成open的
Maven
<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>
<!-- Each annotation is placed on its own line -->
<option>all-open:annotation=com.my.Annotation</option>
<option>all-open:annotation=com.their.AnotherAnnotation</option>
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
相关参考: