Scala 代码底层 demo 理解

scala或者Java代码最终都会编译成JVM可识别的*.class 格式的二进制字节码,*.class 文件可用 jd-gui 软件打开。

举例一

aiguigu.scala 文件 用 scalac aiguigu.scala 该文件后 由于目标是object,scalac编译器会自动创造两个文件( aiguigu.class、 aiguigu$.class  )

object aiguigu{
  def main(args: Array[String]): Unit = {
    println("123")
  }
}
//aiguigu.scala
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="060125:Q!0102	0225	q!Y5hk&<WOC01040335aT-349usz320101050207175	!AB03	05!0521BA04bS36,30nZ;240535Q01CA06173305a!"A070213M3427
\1
05=a!AB!osJ+g
C0322172105!#0104=S:LGO20130213!)Ac02C01+05!Q.Y5o)	122040502f/%210104040205+:LG17C0333'01071$0103be3634cA0635=%21Q0404020603J2430-37	03?	r!a0321
0505b21A02)sK22,g-0302$I	111336:j]36T!!	07")
public final class aiguigu
{
  public static void main(String[] paramArrayOfString)
  {
    aiguigu$.MODULE$.main(paramArrayOfString);
  }
}
//aiguigu.class 反编译结果如上
import scala.Predef.;

public final class aiguigu$
{
  public static final  MODULE$;
  
  static
  {
    new ();
  }
  
  public void main(String[] args)
  {
    Predef$.MODULE$.println("123");
  }
  
  private aiguigu$()
  {
    MODULE$ = this;
  }
}
//  aiguigu$.class 文件反编译结果如上

通过上面编译发现, 当我们单独定义一个 object  类型的时候,scalac 编译器会自动构建类,然后接下来的思路也是 跟Java那套类似。

举例二

比如我们定义个如下的scala文件,scala  中的属性A定义其实还是private的在底层,只不过是在我们创建的时候系统自动搞了一个A(), A_$eq() 举例如下


object CatDemo{
  def main(args: Array[String]): Unit = {
    val cat = new Cat  //  创建一只猫
    cat.name = "小白" //  其实不是直接访问的属性,而是 cat.name_$eq("小白")
    println(cat.name) // 等价于cat.name()
    cat age = 10
    cat.color = "白色"
    printf("小猫信息如下:%s %d %s",cat.name,cat.age,cat.color)
  }
}
// 定义一个类Cat,一个class Cat 对应的字节码文件只有一个Cat.class 默认是public
class Cat {
  // 当我们生命 var name:String 时 底层对应的 private name  同事自动生成两个public方法, name() 类似 getter , name_$eq() 类似setter
  var name:String = ""
  var age:Int = _ // _ 会自动赋值给该变量的默认值
  var color:String = ""
}

上面文件编程后 会生成 Cat.class、CatDemo.class、 CatDemo$.class 两个文件,细节如下

举例三

scala代码,跟仿scala的Java代码如下。 

object Hello2{
  def main(args: Array[String]): Unit = {
    println("hello,scala")
  }
}
//aiguigu.scala

scala 一个文件可以定义若干类,每个类都会编译成一个.class 文件,只是为了了解底层而已,知其所以然

关注公众号 海量干货等你
原文地址:https://www.cnblogs.com/sowhat1412/p/12734174.html