如何使用IDEA查看java文件编译后的字节码内容

目录
  • 首先编写一个java类StringDemo1.java
  • 经过编译后,生成StringDemo1.class文件
  • 使用jclasslib反编译工具
  • JDK版本映射

首先编写一个java类 StringDemo1.java

public class StringDemo1 {
   public static void main(String[] args) {
       String str1 = "aaa" + "bbb";
       System.out.println(str1);
       String str2 = "ccc";
       str2 += "ddd";
       System.out.println(str2);
   }
}

经过编译后,生成 StringDemo1.class文件

使用IDEA查看编译之后的文件内容:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package jdk.java.lang.string;
public class StringDemo1 {
   public StringDemo1() {
   }
   public static void main(String[] args) {
       String str1 = "aaabbb";
       System.out.println(str1);
       String str2 = "ccc";
       str2 = str2 + "ddd";
       System.out.println(str2);
   }
}

可以看出内容已经是经过IDEA反编译之后的了,并不能看到字节码内容。

使用jclasslib反编译工具

在IDEA中搜索插件jclasslib bytecode viewer,然后进行安装,重启IDEA。

再次打开StringDemo1.java文件,在IDEA菜单栏上打开View -> Show Bytecode,即可以看到字节码文件内容:

// class version 52.0 (52)
// access flags 0x21
public class jdk/java/lang/string/StringDemo1 {
 // compiled from: StringDemo1.java
 // access flags 0x1
 public <init>()V
  L0
   LINENUMBER 8 L0
   ALOAD 0
   INVOKESPECIAL java/lang/Object.<init> ()V
   RETURN
  L1
   LOCALVARIABLE this Ljdk/java/lang/string/StringDemo1; L0 L1 0
   MAXSTACK = 1
   MAXLOCALS = 1
 // access flags 0x9
 public static main([Ljava/lang/String;)V
  L0
   LINENUMBER 11 L0
   LDC "aaabbb"
   ASTORE 1
  L1
   LINENUMBER 12 L1
   GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
   ALOAD 1
   INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
  L2
   LINENUMBER 15 L2
   LDC "ccc"
   ASTORE 2
  L3
   LINENUMBER 16 L3
   NEW java/lang/StringBuilder
   DUP
   INVOKESPECIAL java/lang/StringBuilder.<init> ()V
   ALOAD 2
   INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   LDC "ddd"
   INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
   ASTORE 2
  L4
   LINENUMBER 17 L4
   GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
   ALOAD 2
   INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
  L5
   LINENUMBER 18 L5
   RETURN
  L6
   LOCALVARIABLE args [Ljava/lang/String; L0 L6 0
   LOCALVARIABLE str1 Ljava/lang/String; L1 L6 1
   LOCALVARIABLE str2 Ljava/lang/String; L3 L6 2
   MAXSTACK = 2
   MAXLOCALS = 3
}

以上编译内容是我在JDK1.8u202环境下进行编译的,所以开头才会有class version 52.0 (52)的标识。

至于字节码怎么读,就需要继续学习;

Java虚拟机规范中有关于Java虚拟机指令集的相关资料,可以学习研究一下。

随后还可以学习一下ASM技术(Java字节码操控框架);

JDK版本映射

JDK版本 class版本
J2SE 8 52
J2SE 7 51
J2SE 6.0 50
J2SE 5.0 49
JDK 1.4 48
JDK 1.3 47
JDK 1.2 46
JDK 1.1 45

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • IDEA神器一键查看Java字节码及其他类信息插件

    开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥. 何为 Java 字节码? Java 虚拟机(JVM)是运行 Java 字节码的虚拟机.JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果. 什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行

  • 值得收藏!教你如何在IDEA中快速查看Java字节码

    一.javap的参数 -help  --help  -?        输出此用法消息   -version                 版本信息   -v  -verbose             输出附加信息   -l                       输出行号和本地变量表   -public                  仅显示公共类和成员   -protected               显示受保护的/公共类和成员   -package              

  • IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    说明 在学习jvm相关知识时,一般会讲到类字节码相关内容,为了更清晰的了解类字码具体内容,一般我们会使用javap命令进行查看,但是仍然不够直观,有没有更易于理解的方式查看类字节码呢?答案是有的,就是今天本文要给大家介绍的IDEA插件jclasslib Bytecode Viewer. 插件官方地址:https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer 插件安装 在idea插件功能中搜索jclasslib,选择jc

  • 如何使用IDEA查看java文件编译后的字节码内容

    目录 首先编写一个java类StringDemo1.java 经过编译后,生成StringDemo1.class文件 使用jclasslib反编译工具 JDK版本映射 首先编写一个java类 StringDemo1.java public class StringDemo1 {    public static void main(String[] args) {        String str1 = "aaa" + "bbb";        System.o

  • python反编译学习之字节码详解

    前言 如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件:它们的名称以.Py 结尾.你可能还见过另一种类型的文件是 .pyc 结尾的,它们就是 Python "字节码"文件.(在 Python3 的时候这个 .pyc 后缀的文件不太好找了,它在一个名为__pycache__的子目录下面.).pyc文件可以防止Python每次运行时都重新解析源代码,该文件大大节省了时间. Python是如何工作的 Python 通常被描述为一种解释语言,在这种语言中,你

  • Java 将字符串动态生成字节码的实现方法

    可以生成可执行的class文件 直接上能执行代码: 复制代码 代码如下: public class Test { /**  * @param args  */@SuppressWarnings("static-access")public static void main(String[] args) {  try {   new Test().calculate("234 - ( 1 + 45 * 4 ) / 5");  } catch (Exception e)

  • python文件编译为pyc后运行的实现步骤

    目录 一.pyc文件 二.如何编译? 2.1.源码方式编译 2.2.cmd命令方式编译 三.多文件编译 3.1.多文件源码方式编译 3.2.多文件cmd命令方式编译 四.编译后运行注意事项 4.1.原平台运行 4.2.跨平台运行注意事项 一.pyc文件 我们开发一个python脚本,文件的后缀为.py.如果运行这个py文件,Python内部会先将源码文件(.py文件)编译成字节码(byte code)文件(.pyc文件).接着运行编译后的字节码,最后在控制台输出此次运行的结果.总结来说,pyc是

  • 浅谈Java文件被执行的历程

    Java的编译过程 Java程序从源文件创建到程序运行要经过两大步骤 1.源文件由编译器编译成字节码(ByteCode) 2.字节码由java虚拟机解释运行.因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言("semi-interpreted" language). 一个例子 下面我们通过一个简单的 OneTest.java,来看一下一个java文件从编译到运行的历程. Public class OneTest{ public static void

  • 使用Android studio查看Kotlin的字节码教程

    Kotlin是一门JVM语言,它被google大力推广,现如今已经是Android官方推荐的开发语言了.为了更好的学习Kotlin,你必须要从字节码的角度来看待语法特点,这样可以更好的加深自己的理解.这篇文章就是教大家如何通过Android studio来查看Kotlin编译后的字节码. 1.首先选中你要显示字节码的文件,之后点击顶部工具栏中的 Tools ->选中 Kotlin ->在弹出菜单中点击 Show Kotlin Bytecode. 2.点击之后在Android studio最右侧

  • Java之字节码以及优势案例讲解

    一.Java编译器 Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器,.这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口.编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码来将虚拟机代码转换为特定的系统机器码执行.在Java中,这种提供虚拟机理解的代码叫做字节码(即扩展名为 .class的文件),它不面向任何特定的处理器,仅仅只面向虚拟机. 1.利用记事本写一段Java代码 2.将记事本命名为 hello.java 3.cmd+r

  • 基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了test.txt文件的绝对路径: http://www.sun.com/index.htm也代表了一个URL绝对路径: `相对路径`:相对与某个基准目录的路径,包含Web的相对路径(HTML中的相对目录). 例如: 在Servlet中,"/"代表Web应用的根目录,和物理路径的相对表示. 例如: "./"代表当前目录,&quo

  • 详解Java的编译执行与解释执行

    一.前言 编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言,计算机只能识别某些特定的二进制指令,在程序真正运行之前必须将源代码转换成二进制指令.汇编语言通过汇编器翻译成机器指令后执行,一条汇编指令,对应着一条机器指令. 高级语言编程的程序有三种执行方式: 1.一种是编译执行,源程序先通过编译器(负责将源程序翻译成目标机器指令)翻译成机器指令,通过编译-->链接-->

随机推荐