衆所周知,Scala 是運行於Java平臺(Java虛擬機)的,那麼Scala程序編譯之後會生成對應的字節碼文件,我們將字節碼文件反編譯成Java文件即可知Scala 爲我們都做了什麼.
Scala 源代碼
class Test4(a: String) class Test5(val b: String, var c: String) class Test6(private val d: String, private var e: String) class Test7(private[this] val f: String, private[this] var g: String) class Test8(@BeanProperty val f: String, @BeanProperty var g: String) //貌似這種寫法沒有什麼用 class Test9(@BeanProperty private[this] val f: String, @BeanProperty private[this] var g: String)
反編譯後的Java代碼
public class Test4 { public Test4(String a) { } } public class Test5 { private final String b; private String c; public String b(){return this.b; } public String c() { return this.c; } public void c_$eq(String x$1) { this.c = x$1; } public Test5(String b, String c) { } } public class Test6 { private final String d; private String e; private String d(){return this.d; } private String e() { return this.e; } private void e_$eq(String x$1) { this.e = x$1; } public Test6(String d, String e) { } } public class Test7 { public Test7(String f, String g) { } } public class Test8 { private final String f; private String g; public String f(){return this.f; } public String g() { return this.g; } public void g_$eq(String x$1) { this.g = x$1; } public String getF() { return f(); } public String getG() { return g(); } public void setG(String x$1) { g_$eq(x$1); } public Test8(@BeanProperty String f, @BeanProperty String g) { } } public class Test9 { public Test9(@BeanProperty String f, @BeanProperty String g) { } }
總結
主構造器參數 | 生成的字段 | 生成的方法 |
---|---|---|
name:String | 不生成任何字段 | 不生成任何方法 |
val/var name:String | 私有字段 | 公共的getter/setter方法 |
private val/var name:String | 私有字段 | 私有的getter/setter方法 |
private[this] val/var name:String | 不生成任何字段 | 不生成任何方法 |
@BeanProperty val/var name:String | 私有字段 | 公共的Scala版和JavaBean版的 getter/setter方法 |
@BeanProperty private[this] val/var name:String | 不生成任何字段 | 不生成任何方法 |