01 Scala 中Object 反编译Java 模拟运行

Scala 中Object 反编译Java 模拟运行

Scala 源代码

// Obj1.scala
package com.abc.scala

object Obj1 {

  def main(args: Array[String]): Unit = {
    println("I am here.")
  }

	def func(name:String): Unit = {
		println("Greating! " + name)
	}
	
	func("ABC")

}

Scala 编译及运行

# 先scalac 编译后再用scala 运行
scalac Obj1.scala && scala com.abc.scala.Obj1
# 显示
# Greating! ABC
# I am here.

Java 反编译及注释

JD-GUI 反编译软件

// Obj1.java - 略微修改了一下反编译后的代码,使其可以运行,反编译不可能100% 的自动转换
package com.abc.from.scala;

// Scala 中object XXX 运行的main 方法
// 实际上是调用一个类型为XXX$ 的单例对象的main 方法
public class Obj1 {

	public static void main(String[] paramArrayOfString) {
		// Obj1$.MODULE$ 就是衍生类XXX$ 类的单例对象
		Obj1$.MODULE$.main(paramArrayOfString);
	}

}

// 衍生类XXX$ 定义如下
// final class 该类不会被继承
final class Obj1$ {

	// private 修饰构造函数,表示该类不能通过new 获取对象(单例模式的必要条件)
	private Obj1$() {
		// 如果在Scala 的Obj1 对象调用了函数,反编译后调用的代码将出现在这个构造函数中
		func("ABC");
		// Scala 去除了Java 的static 特性,所有和静态相关的(类、方法、对象)都会放到object 中
		// 例如,类的静态方法就会被放入该类的伴生对象中,并且有伴生对象的类会被称为伴生类
		// 还有,包对象就是存放函数和变量的,因为包只能定义类、对象和特质(trait 类似Java 的接口)
	}

	// 该类包含一个名为MODULE$ 的静态引用,它指向该类的一个实例
	public static final Obj1$ MODULE$;

	// 该类被装载进JVM 时立马给MODULE$ 分配实例,单例模式之恶汉式
	static  {
		MODULE$ = new Obj1$();
	}

	// 该类(XXX$)的main 方法供XXX 类的main 方法调用
	public void main(String[] args) {
		System.out.println("I am here. from JD");
	}

	// 在Scala 的object 中定义的方法将与(XXX$)的main 方法平级
	public void func(String name) {
    System.out.println((new StringBuilder()).append("Greating! ").append(name).toString());
  }

}

Java 编译及运行

# 先javac 编译再用java 运行
javac -d . Obj1.java && java com.abc.from.scala.Obj1
# 显示 
# Greating! ABC
# I am here. from JD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值