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

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

以上包装就讲解到这里。

相关文章
|
3天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
3天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
5天前
|
Java 程序员 数据库连接
Java中的异常处理机制:从基础到高级
【9月更文挑战第10天】在Java的世界,异常是程序运行过程中的不速之客。它们悄无声息地潜入,威胁着代码的健康执行。了解并掌握Java的异常处理机制,就如同为程序穿上了一件护身符,让这些意外的访客不再成为灾难。本文将引导你走进Java异常处理的大门,从简单的try-catch语句到自定义异常类的创建,再到finally块的使用和异常链的形成,让你的程序在面对异常时能优雅地起舞。
|
1天前
|
Java 开发者
Java中的异常处理机制
本文将深入探讨Java中异常处理的基本概念和机制,包括try-catch-finally块、throws关键字以及自定义异常类的使用方法。我们将通过实例演示如何在Java程序中有效地捕获和处理异常,确保程序的健壮性和稳定性。无论您是Java编程的初学者还是有一定经验的开发者,本文都能为您提供有价值的参考。
|
3天前
|
Java 程序员 开发者
探索Java中的异常处理机制
【9月更文挑战第12天】在Java编程世界中,异常处理是一块不可或缺的拼图。本文将带领读者深入理解Java的异常处理机制,从基本概念到高级用法,一探究竟。我们将通过实际代码示例,展示如何捕获和处理异常,以及如何自定义异常来增强程序的健壮性。无论你是Java新手还是资深开发者,这篇文章都将为你提供有价值的见解和技巧。
|
2天前
|
Java 开发者
深入解析Java中的异常处理机制
本文将深入探讨Java中异常处理的核心概念和实际应用,包括异常的分类、捕获、处理以及最佳实践。我们将通过具体示例展示如何有效使用try-catch块、throws关键字和自定义异常类,以帮助读者更好地理解和应用Java异常处理机制。
8 1
|
2天前
|
Java 数据库连接 开发者
Java中的异常处理机制:理解与应用
在Java编程中,异常处理是一个核心概念,它允许程序在遇到错误时优雅地恢复或终止。本文将深入探讨Java的异常处理机制,包括异常的分类、如何正确使用try-catch-finally块以及throw关键字。我们将通过实例来说明如何在Java应用程序中有效地捕获和处理异常,以确保程序的健壮性和稳定性。
|
2天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的机制,包括异常的分类、如何捕获和处理异常,以及自定义异常的最佳实践。通过实例讲解,帮助读者更好地理解如何在Java编程中有效管理和利用异常处理来提高代码的健壮性和可维护性。
|
3天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
|
9天前
|
Java 开发者
深入理解Java中的异常处理机制
【9月更文挑战第6天】在Java编程的世界中,异常处理是一块不可或缺的拼图。就像我们在生活中遇到意外时需要冷静思考解决方案一样,Java程序也需要通过异常处理来应对运行时出现的问题。本文将引导你了解Java异常处理的核心概念,并教你如何巧妙地使用try-catch语句和finally块来捕获和处理异常。
15 2