码迷,mamicode.com
首页 > 编程语言 > 详细

JVM(二),Java怎样实现一次编译到处运行(平台无关性)

时间:2019-02-12 20:12:52      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:get   bsp   compile   out   str   font   invoke   sample   system   

二、Java怎样实现一次编译到处运行(平台无关性)

1.java平台无关性原理

 技术图片

Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令。

2.为什么JVM不直接将源码进行编译成机器码去执行

1)准备工作太过繁琐

JVM每次进行编译的时候都会对源代码进行各种检查,纠错

(2)兼容性

JVM不仅仅可以给java语言编译成的class文件进行解释,还可以对任何语言,只要是解释为.class字节码都可以解释

3.查看(.class)字节码

1)准备一个简单的java文件

package com.interview.javabasic.bytecode;

public class ByteCodeSample {
    public static void main(String[] args) {
        int i=1,j=5;
        i++;
        ++j;
        System.out.println(i);
        System.out.println(j);
    }
}

 (2)javac进行编译成.class文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.interview.javabasic.bytecode;

public class ByteCodeSample {
    public ByteCodeSample() {
    }

    public static void main(String[] var0) {
        byte var1 = 1;
        byte var2 = 5;
        int var3 = var1 + 1;
        int var4 = var2 + 1;
        System.out.println(var3);
        System.out.println(var4);
    }
}

技术图片

(3)通过javap指令查看.class文件反编译代码

 技术图片

Compiled from "ByteCodeSample.java"
public class com.interview.javabasic.bytecode.ByteCodeSample {
  public com.interview.javabasic.bytecode.ByteCodeSample();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_5
       3: istore_2
       4: iinc          1, 1
       7: iinc          2, 1
      10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      13: iload_1
      14: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      17: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      20: iload_2
      21: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
      24: return
}

 

JVM(二),Java怎样实现一次编译到处运行(平台无关性)

标签:get   bsp   compile   out   str   font   invoke   sample   system   

原文地址:https://www.cnblogs.com/xzmxddx/p/10366853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!