在之前的字节码分析中缺少对异常的介绍,这次主要来对字节码异常表相关的东东进行一个学习,下面先来编写一个相关异常的小程序: 接着编译来看用javap -verbose来查看一下它的字节码信息: xiongweideMacBook-Pro:classes xiongwei$ javap -verbose com/jvm/bytecode/MyTest3.class Classfile /Users/xiongwei/Documents/workspace/IntelliJSpace/jvm_lect…
1.创建MyTest3类 public class MyTest3 { public void test(){ try { InputStream is = new FileInputStream("test.txt"); ServerSocket serverSocket = new ServerSocket(9999); serverSocket.accept(); }catch (FileNotFoundException ex){ }catch (IOException ex)…
在上一次[https://www.cnblogs.com/webor2006/p/9691523.html]初步对异常表相关的概念进行了了解,先来回顾一下: 其源代码也贴一下: 下面来看一下jclasslib关于这个test()的信息: 咱们重点来看一下Code信息,如下: 其实也就是对应于javap -verbose看到的字节码信息,咱们一行行的跟源代码进行比对一下: 点击看一下new的助字符的官方解释: 实际对应源码就是: 查看一下官网的解释: 查看一下解释: 回到咱们这句话其意思就是将常量…
一道String字符串比较问题引发的字节码分析 public class a { public static void main(String[] args)throws Exception{ } public static void aa(){ String s1="a";//内存在方法区的常量池 String s2="b";//内存在方法区的常量池 String s12 = "ab";//内存在方法区的常量池 String s3 = s1 +…
前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 package com.roocon.thread.t3; public class Sequence { private int value; public int getNext(){ return value++; } public static void main(String[] args) { S…
函数延后估值及字节码分析 在一个循环中定义了函数 f 但是并未对其进行调用,在循环结束后调用,此时i值为3故最终3个函数输出均为9.而非1, 4, 9. 这是由于在定义闭包函数 f 时,传入变量 i,而在循环结束后才调用函数,此时的 i 已为 3,下面使用字节码来查看并论证这一运行顺序. import dis def count(): fs = [] for i in range(1,4): def f(): return i*i fs.append(f) return fs def run()…
目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码,Java真正执行的也是字节码,所以要分析源码的性能需要从字节码的角度分析. 查看字节码详细内容 javap javap 查看classFile的命令并将输出到file.txt javap -v classFile > file.txt 参数 解释 ‐version 版本信息 ‐v ‐verbose…
在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下): public class Ag{ static public int i=10; public static void main(String []args){ switch(i){ default: System.out.println("this is default"); case 1: System.out.println("…
之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public class FinallyTest { public static void main(String[] args) { System.out.println(getMap().get("key")); } public static Map<String,String> g…
直接进入主题.看如下代码: public int test(){ int i=0; try { i=1; return i; } catch (Exception e) { i=2; return i; }finally{ i=3; } } 相信有点经验的程序员一眼就能说出返回的结果为1,但是您真的知道返回的结果为什么为1吗?下面我们通过分析下当前方法的字节码,来说明为什么. 查看字节码命令:javap -verbose class文件   知识点简单概要:看如下字节码需要简单了解下栈的结构.栈…