您的位置:首页 > 编程语言 > Java开发

2.2 Kotlin的Hello Word程序与Java的Hello World的class文件对比

2017-09-06 15:24 761 查看

写在前面

Koltlin本质上是基于JVM的语言,也就是说Kotlin语言编写的源码最终是生成Java字节码.class文件,在Java虚拟机上执行:

本文以Kotlin和Java的Hello World程序为例,展示如何编写编译运行Kotlin程序,以及如何利用反编译工具,了解Kotlin编译器生成的代码与Java的区别,进而了解Kotlin的机制。

- Kotlin语言支持的语法特性,是通过附加Kotlin基本库实现;

- Kotlin编写的代码可能有Kotlin编译器加入很多附加的代码,以在Java平台上实现Kotlin语言特性;

- Kotlin生成的Hello World程序字节码大小有957KB,Java编写的代码大小有423KB;

Kotlin的Hello Word

新建hello.kt文件,输入以下代码:

fun main(args: Array<String>) {
println("Hello,World!")
}


编译并执行:

// 仅仅编译hello.kt,不带kotlin运行库,产生HelloKt.class
kotlinc hello.kt -d D:\kotlin_code

// 引入运行时jar包以及HelloKt.class的目录,运行
kotlin -cp D:\kotlinc\lib\kotlin-stdlib.jar;D:\kotlin_code\  HelloKt

// 或者直接用java命令执行
java -cp D:\kotlinc\lib\kotlin-stdlib.jar;D:\kotlin_code\  HelloKt


分析

编译以后,产生也是字节码文件,HelloKt.class 文件,运行可以直接使用java命令;

使用java反编译工具JD-GUI查看HelloKt.class文件,内容如下:

// Kotlin引入了多个自己的类
import java.io.PrintStream;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

// @Metadata 元数据注解,是由Kotlin编译器支持的,供kotlin编译器和反射使用
// 该注解具有多个参数,指明了Kotlin相关的元数据信息,一次为:
// mv:该注解的版本信息,bv:该class文件的字节码版本信息,k:注明该Kotlin文件的类型,d1:对应类型的元数据格式
// d2: 附加到d1的元数据信息
@Metadata(mv={1, 1, 7}, bv={1, 0, 2}, k=2, d1={"\000\022\n\000\n\002\020\002\n\000\n\002\020\021\n\002\020\016\n\000\032\031\020\000\032\0020\0012\f\020\002\032\b\022\004\022\0020\0040\003?\006\002\020\005"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V"})
public final class HelloKt
{
// 参数加入@NotNull注解,该注解检查参数,如果参数为null时,无法编译
// @NotNull注解是Kotlin库中的注解类
public static final void main(@NotNull String[] args)
{
// Intrinsics(基础类)检查参数是否为null,如果为null,则抛出异常信息:args
Intrinsics.checkParameterIsNotNull(args, "args");

String str = "Hello, World!";

System.out.println(str);
}
}


Java的Hello World

用记事本新建Hello.java文件,输入代码:

public class Hello {

public static final void main(String[] args) {

String str = "Hello, World!";

System.out.println(str);
}
}


编译并执行,编译生成Hello.class

javac Hello.java
java  Hello


使用工具JD-GUI反编译Hello.class,内容如下,基本和Java源码一致;

import java.io.PrintStream;

public class Hello
{
public static final void main(String[] paramArrayOfString)
{
String str = "Hello, World!";

System.out.println(str);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kotlin java