Java 模拟 Scala 的运行机制|学习笔记

简介: 快速学习 Java 模拟 Scala 的运行机制。

开发者学堂课程【Scala 核心编程-基础Java 模拟 Scala 的运行机制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8884


Java 模拟 Scala 的运行机制

 

目录

一、 反编译代码

二、 使用 Java 模拟 scala 运行机制代码

 

接下来通过模拟代码来查看 Scala 编译的执行过程。前面已经使用 ed 将流程展示完了,但是并没有写一段模拟代码,所以本节课将使用 java 写一段模拟代码来展示它是怎样运行的。


一、 反编译代码

这里以 TestScala 为例,代码如下:

package com. atguigu.chapter01

object Testscala {

def main(args: Array[String]): unit = {

println(“hello,scala,idea…”)

}

}

运行结果:

D:\program\jdk8\bin\java…

hello, scala, idea…

Process finished with exit code 0

为什么运行出 hello, scala, idea 呢?写一段模拟代码:

新建一个 New Package 名为 test,打开反编译工具,找到

需要注意的是整个 scala 项目会默认放在,如若不知道放在哪可以右键项目找到 Show in Explorer,打开后就可以发现项目的路径是 C:\Users\Administrator\IdeaProjects\java0705scala\src\main\scala\com\atguigu\chapter01里。

image.png

那么使用反编译寻找:首先找到 C 盘下的用户;打开里面的 Administrator 文件;选择 IdeaProjects,这里面有很多项目文件夹,选择刚才所建的 java0705scala 文件;这里有3个文件夹:.idea、src、target。选择 src 文件, src 是源代码,源代码就是所写的那部分代码;如所写的 main 里的 scala 部分代码,继续往下路径就找到了。

但是这里需要找到 class 文件,则应该在 target 里寻找,发现这里已经有 TestScala.class 文件,将其打开,可以看到代码如下:

package com.atguigu.chapter01;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes=”\006\001%:Q!\001\002\t\002$\t\021\002v3tiN\033\027\r\\1\013\005\r!\021!C2Icb$XM\035\0312\025\t)a!A\004bi\036,\03”)

public final class Testscala

{

public static void main(String[] paramArrayOfString)

{

Testscala..MODULE$ .main (pararArrayOfString) ;

}

}

 

二、 使用 Java 模拟 scala 运行机制代码

可以看到以上代码里有一个 Testscala,由于要模拟它所以创建与它一样的名字,则在 Idea 新建一个 javaClass,名称就为 Testscala。整体代码就显示出来了,这里直接将以上代码复制在其中,代码如下:

package com.atguigu.chaptero1.test;

public class Testscala {

public static void main(string[] paramArrayOfString) {

//Testscala..MODULE$.main(paramArrayOfString);

Testscala$.MODULE$.main(paramArrayOfString);//调用 MODULE$静态函数,再调用 main 函数,paramArrayOfString是其参数。

}

}

这里会报错,是因为代码没有写全,则需要将 Testscala$里的代码复制过来,由于这段代码就已经是 java 代码了,所以复制过来就是反编译 java,将其整理之后代码如下:

final class Testscala$

{

public static final TestScala$ MODULE$;  //补充类型

static

{

MODULE$ = new Testscala$();  //初始化

}

public void main(string[ ] args)

{

System.out.println(“hello,scala,idea...”);//这部分代码在调用时是 Scala 部分,这里不做使用,而是输出一句话。

}

//private Testscala$() {MODULE$ = this; }

}

反编译与实际代码是有区别的,因此在这里做了改进,以上这样就改写完了,可以看出和反编译之后的代码很相像。首先在 TestScala 里写了一个 Object 之后会生成两个 class,即上面代码中的 public class Testscala final class Testscala$TestScala 里代码如下:

package com.atguigu.chapter01

object TestScala {

def maih( args : Array[String]): unit = {

println(“hello,scala,idea...”)

}

}

真正的 main 入口是在 public class Testscala 代码里,但是实际的代码是在下面的 final class Testscala$代码里做了包装,可以理解为 scala 在运行时做了包装。至于做包装的原因由于太复杂这里只做简单解答:scala 是把一个类的静态和非静态分成两个部分,所以需要做包装;如若只有一个类则不会做包装。

所以这里写了一个 Object 就会生成两个值,写了一个主函数进来调用 Testscala$里的 MODULE$。思考在整个运行过程中的 MODULE$对象是否始终是同一个对象呢?也就是说在 scala 里写了一个 object 对象也就等价于 TestScala的一个静态对象而且是单例的,这个在之后会详细讲解。

总结:

只要以后看到有 object,应该有这样的认识:

1. object Testscala 对应的是一个 Testscala$的一个静态对象 MODULE$

2. 在程序中,是一个单例。

运行,观察代码是否能够跑起来:

image.png

D:\program\jdks\bin\java...

hello,scala,idea...

Process finished with exit code 0

可以看到结果是一样的。简单来理解就是它做了一个包装,在调用时底层用了一个静态对象来调用主函数。

以上包装就讲解到这里。

相关文章
|
21天前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
11天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
19 5
Java反射机制:解锁代码的无限可能
|
5天前
|
安全 IDE Java
Java反射Reflect机制详解
Java反射(Reflection)机制是Java语言的重要特性之一,允许程序在运行时动态地获取类的信息,并对类进行操作,如创建实例、调用方法、访问字段等。反射机制极大地提高了Java程序的灵活性和动态性,但也带来了性能和安全方面的挑战。本文将详细介绍Java反射机制的基本概念、常用操作、应用场景以及其优缺点。 ## 基本概念 ### 什么是反射 反射是一种在程序运行时动态获取类的信息,并对类进行操作的机制。通过反射,程序可以在运行时获得类的字段、方法、构造函数等信息,并可以动态调用方法、创建实例和访问字段。 ### 反射的核心类 Java反射机制主要由以下几个类和接口组成,这些类
16 2
|
10天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
19 3
|
10天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
16 2
|
12天前
|
Java 数据库连接 开发者
Java中的异常处理机制####
本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
|
15天前
|
安全 Java 程序员
深入浅出Java中的异常处理机制
【10月更文挑战第20天】本文将带你一探Java的异常处理世界,通过浅显易懂的语言和生动的比喻,让你在轻松阅读中掌握Java异常处理的核心概念。我们将一起学习如何优雅地处理代码中不可预见的错误,确保程序的健壮性和稳定性。准备好了吗?让我们一起踏上这段旅程吧!
22 6
|
12天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 1
|
15天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
37 5
|
16天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
45 5