精华内容
下载资源
问答
  • Hsdis Java汇编指令工具

    2020-06-05 10:07:49
    HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就...
  • Java汇编器 12 BIT Assembler created by Anunay and Tejas Dubhir 如何运行: 1 - Enter code in Input.txt 2 - Compile with command javac * 3 - Output would be stored in output.txt and error in error....
  • Java 汇编指令详解

    千次阅读 2019-07-13 23:32:25
    随着Android开发技术不断被推到新的高度,对于Android程序员来讲越来越需要具备一些对深入的基础性的技术的理解,比如说Java汇编指令。不然,可能很难深入理解一些时下的新框架、新技术,盲目一味追新也会越来越感...

    前言

    随着Android开发技术不断被推到新的高度,对于Android程序员来讲越来越需要具备一些对深入的基础性的技术的理解,比如说Java汇编指令。不然,可能很难深入理解一些时下的新框架、新技术,盲目一味追新也会越来越感乏力。

    本文既不求照本宣科,亦不求炫技或著文立说,仅力图以最简明、最形象生动的方式,结合例子与实战,让小白也能搞懂这门看似复杂的技术概念。

    单刀直入

    闲言碎语不要讲,先表一表,什么是Java汇编指令?简而言之,Java汇编指令就是Java虚拟机能够听得懂、可执行的指令,也可以说是Java代码的最小执行单元。有点Java基础的人一定都知道,javac命令会将Java源文件编译成字节码文件,也就是.class文件,里面就包含了大量的汇编指令。因此可以将javac命令理解为一个翻译命令,将源文件翻译成虚拟机可以执行的指令。那么最直观的探究方法莫过于直接对比一下翻译前后的内容。具体如何对比呢?就不得不用到Java为我们一直默默提供的一项利器,javap命令,它可以解析字节码,将字节码内部逻辑以可读的方式呈现出来。为了紧贴实战,我们直接在新建的Android工程里,写这样一个Activity类,里面包含几个由简单到复杂的方法和一个名为name的字段:

    如图,以上方法,复杂度由低到高依次为:getName<setname<gotobrowser<staticmethod<oncreate,后面我也会按照这个顺序解读其字节码指令的执行逻辑。 下面我们编译工程,然后在下图所示的目录找到该类的字节码文件:<="" p="" style="box-sizing: border-box;">

    cd到这个路径下,运行万能的javap命令:javap -v -p MainActivity,就可以观看到翻译版的Java字节码的胴体了!这里的-v意思是啰嗦模式,会输出全面的字节码信息,而-p是指涵盖所有成员。原字节码信息输出内容较多,基于本文的目标,取其一方法的内容,整理如下图:方法1,getName():

    这个getName的方法应该是再简单不过的Java代码,翻译成字节码后也变成了三行,我们先来简单推理一下:第一句,aload_0不知所云,索性略过;第二行,getfield应该可以读懂,后面这个#2似乎是他的参数(实际上是对常量池的引用),//后面注释的内容是javap给我们加上的,意思应该是#2的指向是"Field name:Ljava/lang/String;"这个内容。所以getfield这一行就是取出name这个字段喽,so easy。areturn肯定就是return的意思,a的含义也先略过不表。总之就是取出name字段然后return喽。

    那么现在的问题就是aload_0是什么意思了,看似多余,但仔细思考一下,似乎之前给getfield指令传入了“Field name:Ljava/lang/String;”这样一个并不完整的参数,其后半部分的“Ljava/lang/String;”仅仅表示这个name字段的类型是String,也就是说,整个参数里没有说是取的谁的name字段啊!究竟是get谁的feild呢?

    1. 由此可以想到:aload操作一定是在为getfield指令准备了一个主体。

    实际上,再结合下面的局部变量表,aload_0中的0正是局部变量表里的Slot 0的含义。意思是将局部变量表里的Slot 0的东西压入操作数栈,这个Slot 0里的东西name正是this,也就是MainActivity的实例,即getfield的主体。

    大戏上演

    好了,对于小白同学有些陌生的概念来了,啥是操作数栈?啥是局部变量表?其实这两个东西理解好了,关于虚拟机指令就懂了一大半了。那么,不妨删繁就简,由易入难,先讲一个这样的故事,故事起名叫:

    1. Java方法之创世纪

    话说Jvm大帝是神之旨意的履行者(Jvm大帝就是虚拟机,神就是开发者,神之旨意是开发者写好并编译后的字节码...),当Jvm大帝带领Java世界运行进入了一个新的方法后,会为这个方法在栈内存大陆上创造两个重要的领域:局部变量表和操作数栈。

    要有栈。要有表。神说。

    依照神之旨意,jvm大帝创造的局部变量表里一般会包含this指针(针对实例方法,静态方法当然无此)、方法的所有传入参数和方法中所开辟的本地变量。

    那么操作数栈是干嘛用的呢?

    我们再引入另外一个比喻,如果把运行Java方法理解为拍戏,那么局部变量表里的各个局部变量就是这部戏的核心主角,或者说领衔主演,而操作数栈正是这部戏的舞台。所谓操作数栈搭台,局部变量唱戏,是也。那么aload0就是告诉Jvm导演(大帝已沦落为导演),请0号演员this同志登台(压栈),演后边的本子。当然了,这个比喻并不完全恰当,因为操作数栈并不是“舞台”的结构,而是栈的结构。但是这个比喻可以很好地说明局部变量表和操作数栈之间的关系,以及aload0的作用。

    下面我们用一张图来演示一下getName这个小剧本桥段所导演的故事:

    好吧这部剧虽然短的可怜,但已经基本把指令、操作数栈和局部变量表三者的关系演绎了出来。值得注意的是,getfield这条指令对操作数栈进行了复合操作,其流程可以示意如下图:

    后面我们将要接触到的许多指令都如此,指令内部执行了弹出—>处理—>压回的流程。下面我们就来分析一个相对复杂一点的方法,setName(String),如下图:

    这里我们看到,变化主要有,指令多了一行,多进行了一次aload,getfield变成了putfield,areturn变成了return,仅此而已。另外领衔主演也就是局部变量表里多了一位,也就是方法的传入参数name字符串对象了。其情节如下:

    这里,putfield只弹出栈内的操作数,而没有向操作数栈压回任何数据,而且执行putfield之前,栈内元素的位置也必须符合“值在上,主体在下”要求。而最后的return仅表示方法结束,而不会像areturn一样返回栈顶元素。这也印证了setName(String)方法没有返回参数。

    融会贯通

    相信有了以上的讲解,大家对指令、操作数栈、局部变量表三者的运作关系有了一定认识,为了后边能够分析更复杂的方法,这里必须概括性地讲解一下更多的Jvm汇编指令。虽然Jvm汇编指令非常多,但其实常用的不外乎几个类别,先从这几个常用类别入手理解,便可渐入佳境。关于Java汇编指令的分类,可以从两个维度进行:一是指令的功能,二是指令操作的数据类型。我们先从功能说起,指令主要可以分为如下几类:

    1. 存储和加载类指令:主要包括load系列指令、store系列指令和ldc、push系列指令,主要用于在局部变量表、操作数栈和常量池三者之间进行数据调度;(关于常量池前面没有特别讲解,这个也很简单,顾名思义,就是这个池子里放着各种常量,好比片场的道具库)

    2. 对象操作指令(创建与读写访问):比如我们刚刚的putfield和getfield就属于读写访问的指令,此外还有putstatic/getstatic,还有new系列指令,以及instanceof等指令。

    3. 操作数栈管理指令:如pop和dup,他们只对操作数栈进行操作。

    4. 类型转换指令和运算指令:如add/div/l2i等系列指令,实际上这类指令一般也只对操作数栈进行操作。

    5. 控制跳转指令:这类里包含常用的if系列指令以及goto类指令。

    6. 方法调用和返回指令:主要包括invoke系列指令和return系列指令。这类指令也意味这一个方法空间的开辟和结束,即invoke会唤醒一个新的java方法小宇宙(新的栈和局部变量表),而return则意味着这个宇宙的结束回收。

    如下图,展示了各类指令的作用:

    再从另外一个维度,即指令操作的数据类型来讲:指令开头或尾部的一些字母,就往往表明了它所能操作的数据类型:

    a对应对象,表示指令操作对象性数据,比如aload和astore、areturn等等。i对应整形。也就有iload,istore等i系列指令。f对应浮点型。l对应long,b对应byte,d对应double,c对应char。另外地,ia对应int array,aa对应object array,da对应double array。不在一一赘述。

    了解了以上内容,我们再去看最后几个方法,应该就会容易理解很多了。下面我们就直捣黄龙gotoBrowser这个方法:

    这个过程简单解读如下:

    1. new一个Intent对象(在堆内存中开辟空间),并将其引用入栈;

    2. dup复制栈顶的刚刚放入的引用,再次压栈,这时栈里有两个重复的内容,深度为2;

    3. 从常量池取出“android.intent.action.View”这个字符串(对象引用)压栈,此时栈深度为3;

    4. 弹出栈顶的两个对象,调用弹出的第二个对象的 方法,栈深度为1;

    5. 将此时栈顶引用弹出并存储到局部变量中(slot 2),此时栈就清空了,深度0;

    后面的就相对简单了,读者可以尝试自己解读。再看这个包含if跳转的方法staticMethod:

    如上图,图中已经说明的比较全面了,不再赘述。值得一提的是,Java的这种基于栈结构的汇编指令,在设计上有一种非常简洁的美感,指令与指令之间并没有较重的依赖,每条指令仅仅与操作数栈等领域内的数据发生关系,充满着某种平衡与秩序感。因此也必须注意,几乎每条指令的运行都有其前提,比如在invokevirtual或invokespecial指令执行前,必须保证操作数栈内提前按顺序压入好所需的操作数,否则就会发生问题。关于最复杂的onCreate方法,就不再啰嗦解读了,读者可以前往我的github上的对应demo repo,进入tutorial分支,拉取源码和教程资源,或者自己写demo体验这一完整过程。地址:https://github.com/BryanSharp/hiBeaverDemo

    后话

    关于实战,一是可以学习使用强大开源工具ASM.jar;二是,特别对于Android同学,可以参考本人的另一篇文章:Android字节码修改神器HiBeaver:黑掉你的SDK(https://segmentfault.com/a/1190000008491823)以及一次Android字节码插桩实战(https://segmentfault.com/a/1190000008658815),利用hibeaver这个助手,开发者可以非常灵活地对字节码进行修改,插入指令,hook代码,甚至建立一些简单的AOP框架,对于Java字节码学习大有裨益。hibeaver完全开源,github项目地址:https://github.com/BryanSharp/hibeaver

    祝玩的愉快!本文如有不妥之处,欢迎交流指正。

    另外,本文为了尽可能地简明生动、直入核心,简化了很多概念和细节,读者须知实际情况的更为复杂。但相信在理解了本文以后,就可以抓住Java汇编指令的核心理念,也就算扣开虚拟机学习的大门并可以开始读书精进了。下面盗图一张(后有出处),可作拓展:

     

    展开全文
  • Java汇编语言简述

    2020-05-12 17:22:07
    Java语言由美国sun公司于1995年推出的高级汇编语言。 1.Java概述: JavaSE(Java标准版本) JavaEE(Java企业级应用版本) JavaME(安卓和嵌入设备) JRE(Java Runtime Environment):Java运行时环境,包括JVM和...

    Java语言由美国sun公司于1995年推出的高级汇编语言。
    1.Java概述:
    JavaSE(Java标准版本)
    JavaEE(Java企业级应用版本)
    JavaME(安卓和嵌入设备)
    JRE(Java Runtime Environment):Java运行时环境,包括JVM和运行时的核心类库。
    JDK(Java Development Kit):Java程序开发工具包,包含jre和开发人员使用的工具。

    2.Java入门开发
    Java开发三步骤:编写、编译、运行
    编译:将编写的java源文件翻译成jvm认识的class文件,这个过程中javac编译器将检查编写的是否有错误,有错误会给出相应的提示。
    运行:将clss文件交给虚拟机JVM运行,即执行编写的程序文件。
    3.Java注释
    单行注释://
    多行注释:/**/
    文本注释:/**开头,*/结尾
    4.关键字
    java中已经定义好的单词,具有特殊含义。不能死记硬背。
    主要关键字:abstract、break、case、continue、else、do、if、try、void等。
    5.标识符
    程序中自己定义的内容,比如:类的名字、方法的名字、变量的名字等。
    命名规则:硬性要求
    标识符可以包含26字母(区分)、0-9数字、$、_
    标识符不能以数字开头
    标识符不能是关键字
    命名规范:软性要求
    类名规范:大驼峰-首字母大写、后面每个字母大写
    方法名规范:小驼峰-首字母小写,后面每个首字母大写
    变量名规范:小驼峰-首字母小写,后面每个首字母大写
    6.常量
    在java中固定不变的数据。
    分类:整数、小数、字符、字符串、布尔、空常量
    7.变量
    程序中可以变化的量称之为变量,Java中要求一个变量每次只能保存一个数据,必须明确保存的数据类型。
    变量定义三要素:数据类型、变量名、数据值

    注意:long类型后面建议加上L表示
    float类型后面必须加上f表示
    8.数据类型:基本数据类型和引用数据类型
    基本数据类型:字节型(byte)、短整型(short)、整型(int)、长整型(long)、单精度浮点(float)、双浮点(double)、字符型(char)、布尔型(boolean),其中java默认类型:整数类型为int、浮点类型为double
    引用数据类型:类、数组、接口
    9.数据类型转化
    自动转换:将取值范围小的类型自动提升为取值类型范围大的类型。
    强制类型转换:将范围大的类型装换成范围小的类型。
    注意:浮点转成整数,直接取消小数点,可能造成数据损失精度;int强制转换成short砍掉2个字节,可能造成数据丢失。

    展开全文
  • 打印Java汇编指令 使用hsdis工具打印汇编指令,可以自行编译或者下载已编译好的dll或so文件,并将文件拷贝至jdk安装目录下的bin/server或者bin/client,例如:D:\Program Files\Java\jdk1.8.0_131\bin\server\hsdis-...

    当前环境:jdk1.8,win10,64位

    打印Java汇编指令

    使用hsdis工具打印汇编指令,可以自行编译或者下载已编译好的dll或so文件,并将文件拷贝至jdk安装目录下的bin/server或者bin/client,例如:D:\Program Files\Java\jdk1.8.0_131\bin\server\hsdis-amd64.dll
    或执行:export LD_LIBRARY_PATH=/hsdis路径
    windows下编译教程:https://dropzone.nfshost.com/hsdis/
    mac: https://kenai.com/projects/base-hsdis/downloads/directory/gnu-versions,或:https://download.csdn.net/download/u010597819/15346516
    执行Java命令增加如下参数,参考:https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly
    或者可以将参数放在标志文件中并通过参数指定标志配置文件:-XX:Flags=myhotspotrc.txt

    -server 
    -XX:+UnlockDiagnosticVMOptions // 由于下面的参数属于诊断参数,所以在使用之前需要打开UnlockDiagnosticVMOptions参数
    -XX:+TraceClassLoading 
    -XX:+PrintAssembly // 为字节码与本地方法打印汇编代码print assembly code for bytecoded and native methods
    -XX:+LogCompilation 
    -XX:+DebugNonSafepoints (日志非常多,可以选择不加该参数)
    -XX:LogFile=VisibilityWithoutVolatile.log // 指定日志文件
    -Xcomp // JVM在第一次执行时便会把所有的字节码编译成本地代码
    -XX:CompileCommand=compileonly,*VisibilityWithoutVolatile.* 仅编译指定类的某个方法,星号代表所有方法(会丢失很多内容,不要为了减少日志而增加该参数,因小失大-_-!!!)
    // 不需要加该参数:-XX:CompileCommand=dontinline,*VisibilityWithoutVolatile.* 内联问题,可以指定不对某些方法进行jit编译,跳过有问题方法的编译 // Allow use of -XX:CompileCommand=dontinline to exclude problematic methods
    

    使用jitwatch分析日志

    使用方法参考:https://github.com/AdoptOpenJDK/jitwatch
    博主是通过mvn引入pom依赖,然后直接执行jitwatch的main方法开始使用。源码地址:https://github.com/GallantKong/jitwatch-example

    import org.adoptopenjdk.jitwatch.launch.LaunchUI;
    
    /**
     * @author 会灰翔的灰机
     * @date 2019/10/30
     */
    public class JITWatchMain {
    
        public static void main(String[] args) {
            LaunchUI.main(args);
        }
    }
    
    --pom.xml
    
    <dependency>
      <groupId>com.chrisnewland</groupId>
      <artifactId>jitwatch-parent</artifactId>
      <version>1.1.5</version>
      <type>pom</type>
    </dependency>
    <dependency>
      <groupId>com.chrisnewland</groupId>
      <artifactId>jitwatch</artifactId>
      <version>1.1.5</version>
    </dependency>
    <dependency>
      <groupId>com.chrisnewland</groupId>
      <artifactId>jitwatch-ui</artifactId>
      <version>1.1.5</version>
    </dependency>
    

    配置jitwatch

    源码文件目录
    字节码文件目录
    在这里插入图片描述

    问题

    不显示源码

    不显示源码问题主要因为源码路径配置不对,需要配置到源码的具体所在目录,jitwatch不会自动递归目录查找源码

    不显示汇编代码

    全部显示没有汇编代码,或者部分显示有汇编代码,部分没有。案例如图:显示不是JIT编译代码
    在这里插入图片描述

    1. jvm在方法执行达到一定的热度才会将代码编译成特定平台的汇编语言执行,使用-Xcomp参数指定jvm在第一次执行时把所有的字节码编译成本地代码
    2. 大型方法会在执行到限制时才会执行编译。所以平时不建议大家方法写的过大跟该参数的默认启用有些关系
    -XX:+DontCompileHugeMethods // 打开不编译巨大的方法,直至达到限制
    -XX:HugeMethodLimit=8000 // HotSpot VM默认不会JIT编译字节码大小超过8000字节的方法
    

    方法汇编代码显示级别不同

    1. 如下图:run方法显示级别为#3(C2/OSR/level4);main方法提示级别为#2(C2/level4)
      在这里插入图片描述
      在这里插入图片描述
    展开全文
  • 装配模糊 一个用 Java 编写的简单汇编语言解释器。
  • 在研究JVM时,想要研究下volatile关键字的底层实现,需要其对其汇编代码的指令进行观察,故需要查看即时编译器产生的汇编代码。 正文 环境:linux(deepin) hsdis的配置 进入...

    前言

    在研究JVM时,想要研究下volatile关键字的底层实现,需要其对其汇编代码的指令进行观察,故需要查看即时编译器产生的汇编代码。

    正文

    环境:linux(deepin)

    hsdis的配置

    1. 进入https://sourceforge.net/projects/fcml/files/fcml-1.1.3/,下载源码并解压(这里可能需要科学上网)
    2. cd fcml-1.1.3
    3. ./configure && make && sudo make install
    4. cd example/hsdis && make && sudo make install
    5. source /etc/profile
    6. sudo ln -s /usr/local/lib/libhsdis.so <JAVA_HOME>/lib/amd64/hsdis-amd64.so
    7. sudo ln -s /usr/local/lib/libhsdis.so <JAVA_HOME>/jre/lib/amd64/hsdis-amd64.so

    此时随便编写一个java文件Test.java。

    1. javac Test.java
    2. java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Test
      成功打印汇编代码信息。

    jitwatch工具的使用

    以上打印的汇编代码过于杂乱,可以通过jitwatch工具来提供便利。

    1. git clone https://github.com/AdoptOpenJDK/jitwatch
    2. cd jitwatch
    3. mvn clean
    4. mvn install
    5. ./launchUI.sh
      此时便可以打开jitwatch工具。

    具体查看某个类的汇编代码的步骤如下:
    首先,使用 Hsdis 执行代码,输出反汇编内容:

    javac Test.java
    java -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading  -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=test.log Test    # Test是java文件类名, test.log 是输出的 log 文件,输出到当前目录下
    

    接着,通过jitwatch工具open log打开日志文件,即可以看到各个方法的汇编代码,关于此工具的更多使用说明可自行搜索。

    总结

    再次看周志明的《深入理解Java虚拟机》,感觉好接受很多了,JVM还得沉下心来慢慢学。

    展开全文
  • 茉莉 用于Java汇编
  • IDEA查看Java运行代码的汇编指令工具,将文件导入jre/bin中后,在IDEA中进行相关配置,即可查看汇编指令,具体方法可参看:https://blog.csdn.net/Dongguabai/article/details/82818120
  • Java 汇编代码

    2018-10-11 00:40:00
    https://shipilev.net/blog/2015/black-magic-method-dispatch/ ... http://mail.openjdk.java.net/pipermail/panama-dev/2015-December/000225.html https://s...
  • windows系统配置java环境参考文章 https://writing-bugs.blog.csdn.net/article/details/119913669
  • 居然还有方式可以查看Java方法的汇编代码,真是神奇。 耶~ 当我们在研究java的内部实现时,经常会需要查看java方法的字节码,有时为了确定一些问题,甚至还需要查看某些方法在jit编译后的汇编代码。 这篇文章我们...
  • 把下面文件放到JRE_HOME/bin/server hsdis-amd64.dll ...指定java的jvm参数 -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*VolitaleDemo.main 运行java
  • 查看Java汇编指令

    千次阅读 2018-08-30 11:02:19
    而有时候想看某些JDK底层实现,发现反编译得到的代码并没有什么帮助,因此本文介绍如何查看Java汇编指令,查看Java代码最真实的运行细节。 Java本身提供这个支持,但需要引入而外的包(hsdis-amd64.dylib)。 ...
  • 而有时候想看某些JDK底层实现,只是得到一些反编译的代码,那么我想要查看Java汇编指令,查看Java代码最真实的运行细节,要该怎么做呢? Java本身提供这个支持,但需要引入而外的包 Mac下(hsdis-amd64.dylib): ...
  • 1.下载hsdis-amd64.dll 2.复制文件到jre下的bin/server目录 3.在idea中配置VM选项,内容如下: -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Bar.sum
  • 如何查看JAVA程序的汇编代码

    千次阅读 2019-07-25 10:26:25
    如何查看JAVA程序的汇编代码 查看汇编需要加入虚拟机参数 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*TestVolatile1.getInstance TestVolatile1 java -XX:+...
  • javap命令分析java汇编指令

    千次阅读 2019-12-04 16:35:14
    https://www.jianshu.com/p/6a8997560b05 欢迎加群:854228077。 帮助更多java程序员提升技术!资料多,大佬多!
  • 【 声明:版权所有,欢迎转载,请勿用于商业用途。...这个时候,很多同学会说,如果是java的程序,有没有办法看到对应的反汇编代码。其实是有的。答案就是javap程序。 1、编写简单的java代码 impo...
  • 在IDEA 上如何打印汇编信息: ==> ==> ==> ==> ==> ==> ==> ==> 结束 如何使用: 1. 找到你需要编译的类: 待运行的代码: public class OptimazeLock { ...
  • 太执着于这个东西反而得不偿失,我应该会去先把深入Java虚拟机最后一点看完,然后把spring源码分析一遍,现在来说,openjdk就暂时先放下了,不过这都是后话了,今天的重点是查看Java运行时的汇编指令 当时看深入...
  • java汇编工具

    2018-12-26 10:57:12
    jd-jui-windows,还在为看不了class文件烦恼吗!java汇编工具来袭,帮你解决debug问题。
  • 在OpenJDK里有一个...用类似java本身的语法来定义类和函数,字节码指令则很像传统的汇编。 JCOD 整个.class用容器的方式来表示,可以很清楚表示类文件的结构。 重要的是两种语法的文件都是可以和.class互相转换的
  • 访问这里下载对应版本的hsdis: Windows: hsdis-1.1.1-win32-amd64.zip hsdis-1.1.1-win32-i386.zip Mac: hsdis-amd64.dylib 将解压到的两个文件复制到: C:\Program Files\Java\jdk1.8.0_191\jre\bin\server\ IDEA...
  • 1、添加工具: File --> Tools --> External Tools --> “+” 应用–>确定。 在java文件上右键查看即可: 内容为:
  • 日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
  • 我们要想看到更底层的代码 更好的理解代码 通常我们会通过反汇编来查看汇编代码 当然Java 也是提供支持的通过开启以下两个属性即可 idea中添加JVM运行的参数即可 参数为-server -Xcomp -XX:+...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,499
精华内容 37,799
关键字:

java汇编

java 订阅