我是注释处理和代码生成的新手。我想知道如何执行这样的操作,比如将新方法附加到现有类。这是我想要做的一个例子:
假设我们有一个带有自定义注释的类,如下所示:
class SourceClass {
@CustomAnnotation
fun annotatedFun1(vararg argument: Any) {
//Do something
}
@CustomAnnotation
fun annotatedFun2(vararg argument: Any) {
//Do something
}
fun someOtherFun() {
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到的结果 - 该类的扩展副本:
class ResultClass {
fun hasFunWithName(name: String): Boolean {
return (name in arrayOf("annotatedFun1", "annotatedFun2"))
}
fun callFunByName(name: String, vararg arguments: Any) {
when (name) {
"annotatedFun1" -> annotatedFun1(*arguments)
"annotatedFun2" -> annotatedFun2(*arguments)
}
}
fun annotatedFun1(vararg argument: Any) {
//Do something
}
fun annotatedFun2(vararg argument: Any) {
//Do something …Run Code Online (Sandbox Code Playgroud) 我上周从不同设备通过Firebase Crashlytics获得了多个奇怪的崩溃报告.他们是:
堆栈跟踪是相同的,不包括对我的代码的任何引用,所以我不知道崩溃发生在哪里以及原因.搜索我的例外没有任何结果.所以我希望有人可以帮助我调查这些崩溃事件.据我所知,崩溃发生在ConstraintLayout库中的某个地方(我使用的是1.1.3版本).
崩溃堆栈跟踪:
Fatal Exception: java.lang.StackOverflowError
at java.util.HashMap$KeySet.<init>(HashMap.java:911)
at java.util.HashMap$KeySet.<init>(HashMap.java:911)
at java.util.HashMap.keySet(HashMap.java:696)
at java.util.HashSet.iterator(HashSet.java:161)
at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:70)
at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:140)
at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:71)
at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:140)
----A lot of identical lines----
at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:71)
at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:85)
at android.support.constraint.solver.widgets.ConstraintWidgetContainer.solveGraph(ConstraintWidgetContainer.java:586)
at android.support.constraint.solver.widgets.ConstraintWidgetContainer.optimize(ConstraintWidgetContainer.java:643)
at android.support.constraint.solver.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:328)
at android.support.constraint.ConstraintLayout.solveLinearSystem(ConstraintLayout.java:1860)
at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1621)
at android.view.View.measure(View.java:16749)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1235)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.widget.ScrollView.onMeasure(ScrollView.java:327)
at android.view.View.measure(View.java:16749)
at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
at android.view.View.measure(View.java:16749)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:16749)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:696)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:589)
at …Run Code Online (Sandbox Code Playgroud) 当我从5.0更新到5.1时,Gradle改变了它的行为。
假设我们有一个带有名为library的单个模块的android项目。在Gradle 5.0(和以前的版本)上,当我执行./gradlew assembleRelease或./gradlew assembleDebug生成输出时分别是library-release.aar或library-debug.aar。
更新到Gradle 5.1(我也尝试过5.1.1)之后,它仅library.aar针对任何构建类型生成,而输出文件名中没有任何构建类型分类器。
所以我的问题是:如何强制Gradle 5.1为以前的不同构建类型设置正确的输出文件命名?以下是我的库模块的build.gradle.kts,但我认为它没有问题:
import org.jetbrains.kotlin.config.KotlinCompilerVersion
plugins {
id("com.android.library")
id("kotlin-android")
id("maven-publish")
}
val libraryVersion = "1.5.0"
android {
compileSdkVersion(28)
defaultConfig {
minSdkVersion(16)
targetSdkVersion(28)
versionCode = 1
versionName = libraryVersion
}
lintOptions {
isAbortOnError = false
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs")))
implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
}
Run Code Online (Sandbox Code Playgroud)
更新:
如果我在build.gradle.kts中添加以下代码:
afterEvaluate { …Run Code Online (Sandbox Code Playgroud)