Java虚拟机--编译与反编译

  当我们写完HelloWorld.java文件后,计算机怎么知道我们要干什么?那就需要说下编译了(可见文章:JIT编译),这里也简单补充点:

1.编程语言:

  编程语言分为高级语言低级语言:C、C++、Java等属于高级语言;机器语言和汇编语言属于低级语言。那和编译有什么关系呢?

  简而言之,编译就是把程序员认识的高级语言转换成机器认识的低级语言的过程,可用命令javac进行编译;相对的,反编译就是把机器看得懂的转成程序员看的懂的,理论上是把class文件转成java文件,但实际上是转成了我们可以看的懂的字节码,要想分析程序运行的背后原理,反编译必不可少。

2.编译

  再来说下编译,编译可分为前端编译后端编译,前者与语言有关,目标机器无关;后者与目标机器有关,语言无关。放在Java中,把.java文件编译成.class文件称为前端编译把.class文件编译成机器语言称为后端编译

  前端编译成的.class文件中的字节码是一种中间代码,其有两点重要性质:易于生成能轻松的翻译成目标机器上的语言

  后端编译,会将字节码解释成机器指令,为了提高性能和效率,引入了JIT技术,将“热点代码”翻译成机器指令,优化并缓存起来,以备下次使用。详见:JIT编译

3.反编译

  我们对本地代码进行反编译,来体会一下它的用处。

  我们有没有想过枚举类是个什么类?enum是什么意思?这时就需要反编译了:

  反编译前


   这里写图片描述

  反编译后


   这里写图片描述

  经过反编译可知,enum类是一个被final修饰的class并继承了lang包下的Enum类,这样我们就知道它是怎么回事儿了。

  再比如


   这里写图片描述

  上面两张图是switch结构的两种数据类型,那有什么不一样呢?看是看不出来的,反编译后就知道了:


   这里写图片描述

  通过反编译可知,整型的直接比较数值char类型的比较ascii码,会转成int型,那问题来了,String类型呢?通过反编译将会知道,String类型是通过equals()和hashCode()方法来实现。所以,Switch只支持一种数据类型,那就是整型,其他数据类型都会进行转换。

  所以,通过反编译可以更加深入的理解代码,了解其背后的运行原理,你还在等什么呢?

猜你喜欢

转载自blog.csdn.net/weixin_39124328/article/details/81387123