我们知道要声明变量static,我们必须使用ntdll.TlsBitmap
。
下面列出了一个简单的例子。
companion object
这可以在其他活动中以class MainActivity : AppCompatActivity() {
companion object {
val extraMessage = "message"
}
}
的形式访问,非常简洁。
然而,文档指出,语法看起来像静态,但在运行时它们仍然是真实对象的实例成员。
因此,Kotlin没有静态成员,或者Kotlin只提供了编写代码的简单方法。
答案 0 :(得分:2)
在intelliJ中,您可以让kotlin插件对生成的字节码进行反编译,以便您可以看到正在发生的事情。您的代码生成以下代码的近似值:
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;
import android.support.v7.app.AppCompatActivity;
@Metadata(
mv = {1, 1, 7},
bv = {1, 0, 2},
k = 1,
d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"},
d2 = {"LMainActivity;", "Landroid/support/v7/app/AppCompatActivity;", "()V", "Companion", "special module for files not under source root"}
)
public final class MainActivity extends AppCompatActivity {
@NotNull
private static final String extraMessage = "message";
public static final MainActivity.Companion Companion = new MainActivity.Companion((DefaultConstructorMarker)null);
@Metadata(
mv = {1, 1, 7},
bv = {1, 0, 2},
k = 1,
d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0003\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u0014\u0010\u0003\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006¨\u0006\u0007"},
d2 = {"LMainActivity$Companion;", "", "()V", "extraMessage", "", "getExtraMessage", "()Ljava/lang/String;", "special module for files not under source root"}
)
public static final class Companion {
@NotNull
public final String getExtraMessage() {
return MainActivity.extraMessage;
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
答案 1 :(得分:0)
为了这个答案的目的,我删除了扩展名以允许它在普通的Kotlin中编译,它不应该影响答案
此代码:
class MainActivity {
companion object {
val extraMessage = "message"
}
}
在反编译类文件时使用此java代码(使用http://www.javadecompilers.com/):
import kotlin.Metadata;
public final class MainActivity {
public static final MainActivity.Companion Companion = new MainActivity.Companion(null);
private static final String extraMessage = "message";
public MainActivity() {}
}
如图所示,extraMessage存储为生成的类的静态字段,Kotlin允许访问字段与Java中相同。