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


    二、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
    }
  • 相关阅读:
    利用中转输出表制作HijackDll
    webshell查杀
    说说无线路由器后门的那些事儿(1)-D-Link篇
    htpwdScan — 一个简单的HTTP暴力破解、撞库攻击脚本
    OD消息断点
    Burp Suite详细使用教程-Intruder模块详3
    burp intruder模块详解
    谈谈神的能力
    语法入门基本概念
    多项式
  • 原文地址:https://www.cnblogs.com/xzmxddx/p/10366853.html
Copyright © 2020-2023  润新知