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

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

以上包装就讲解到这里。

相关文章
|
2月前
|
Java API 开发者
深入理解Java中的异常处理机制
本文探讨了Java编程语言中异常处理的核心概念,包括异常类型、异常捕获与抛出、以及最佳实践。通过分析常见的异常场景和处理策略,旨在帮助开发者更好地理解和运用异常处理机制,提高代码的健壮性和可维护性。文章不仅涵盖了基本的try-catch结构,还深入讨论了自定义异常的创建与使用,以及finally块的重要性和应用。此外,还将介绍一些高级技巧,如多异常捕获和嵌套异常处理,为读者提供全面的技术指导。
115 0
|
2月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
149 1
|
2月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
74 2
|
2月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
98 20
|
2月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
88 4
|
2月前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
60 3
|
2月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
3月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
168 6
|
3月前
|
Java API 数据库
Java 反射机制:动态编程的 “魔法钥匙”
Java反射机制是允许程序在运行时访问类、方法和字段信息的强大工具,被誉为动态编程的“魔法钥匙”。通过反射,开发者可以创建更加灵活、可扩展的应用程序。
82 2
|
3月前
|
Java 开发者
Java中的异常处理机制####
本文深入探讨了Java编程语言中异常处理的核心概念,旨在为开发者提供一套清晰的异常管理策略。不同于传统的摘要概述,本文将通过一个实际案例,逐步揭示如何有效地捕获、处理和抛出异常,以及如何利用自定义异常来增强程序的健壮性和可读性。我们将从基础的try-catch语句出发,逐步深入到finally块的使用,再到throws和throw关键字的区别,最后展示如何创建自定义异常类,以应对特定错误情况。 ####
29 0

热门文章

最新文章