二、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 }
原文地址:https://www.cnblogs.com/xzmxddx/p/10366853.html
时间: 2024-11-05 20:37:02