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); } }
相关文章推荐
- 用记事本编写第一个Java程序运行时 出现报错:错误: 类helloworld是公共的, 应在名为 helloworld.java 的文件中声明 public class helloworld {
- 8.为Hello World程序编写JSP文件,Java文件和配置文件
- 对android应用安装程序apk反编译与分析(二)-jad将class文件转化为java文件
- 在Eclipse中查看自己写的java程序的class文件
- jar2exe提取class文件,破解java的exe程序
- 修改了java程序,tomcat中对应的class文件没有更新
- beyond compare 对比java class 文件
- linux下运行java小程序 class文件
- Java程序在运行的时候具体是如何确定.class文件位置的呢?
- 用java语言编译内存中java小程序,并将生成的.class文件保存在一个文件夹下。
- Class文件,java程序执行过程,classloader原理
- 完美解决Java程序在 MOTO E680i 中声音文件播放(转载)
- 完美解决Java程序在 MOTO E680i 中声音文件播放
- java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver Eclipse3.1 数据库连接测试程序(SQL Server 2000 Driver for JDBC Service Pack 3 安装测试)
- Java程序运行结果输出到一个文件中去,结果显示乱码
- 将Java的class文件转为EXE文件的八种方法
- 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- JAVA实现用系统关联的程序打开文件
- 解析java的*.class文件
- 利用Java编写HTML文件分析程序