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

来源:互联网 发布:工业英语翻译软件 编辑:程序博客网 时间:2024/05/16 12:38

写在前面

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);  }}
原创粉丝点击