public static void main(String[] a) {
String target="abc";
String r;
switch(target){
case "abc":
r="cba";
break;
default:
case "def":
r="fed";
}
System.out.println(r);
}
Eclipse JDT
Stack: 2, Locals: 4
0 ldc <String "abc"> [16]
2 astore_1 [target]
3 aload_1 [target]
4 dup
5 astore_3
6 invokevirtual java.lang.String.hashCode() : int [18]
9 lookupswitch default: 66
case 96354: 36
case 99333: 48
36 aload_3
37 ldc <String "abc"> [16]
39 invokevirtual java.lang.String.equals(java.lang.Object) : boolean [24]
42 ifne 60
45 goto 66
48 aload_3
49 ldc <String "def"> [28]
51 invokevirtual java.lang.String.equals(java.lang.Object) : boolean [24]
54 ifne 66
57 goto 66
60 ldc <String "cba"> [30]
62 astore_2 [r]
63 goto 69
66 ldc <String "fed"> [32]
68 astore_2 [r]
69 getstatic java.lang.System.out : java.io.PrintStream [34]
72 aload_2 [r]
73 invokevirtual java.io.PrintStream.println(java.lang.String) : void [40]
76 return
经过:
1.switch通过hashcode找出大概位置(因为有hashcode冲撞的可能)
2.调用String.equals方法找到正确目标字节码位置,直接执行操作
JDK7u10
stack=2, locals=5, args_size=1
0: ldc #2 // String abc
2: astore_1
3: aload_1
4: astore_3
5: iconst_m1
6: istore 4
8: aload_3
9: invokevirtual #3 // Method java/lang/String.hashCode:()I
12: lookupswitch { // 2
96354: 40
99333: 55
default: 67
}
40: aload_3
41: ldc #2 // String abc
43: invokevirtual #4 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
46: ifeq 67
49: iconst_0
50: istore 4
52: goto 67
55: aload_3
56: ldc #5 // String def
58: invokevirtual #4 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
61: ifeq 67
64: iconst_2
65: istore 4
67: iload 4
69: lookupswitch { // 2
0: 96
2: 102
default: 102
}
96: ldc #6 // String cba
98: astore_2
99: goto 105
102: ldc #7 // String fed
104: astore_2
105: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
108: aload_2
109: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
112: return
经过:
1.switch通过hashcode找出大概位置(因为有hashcode冲撞的可能)
2.调用String.equals方法找到正确目标,此目标已经在内部生成字节码时用int值代替
3.通过switch代替的int值,找到正确目标字节码位置,直接执行操作
总结:
Eclipse JDT对switch字符串生成的字节码更高效,更紧凑
作者:翁志艺
分享到:
相关推荐
eclipse.jdt.core, jdt/核心项目库( eclipse jdt core ) JDT内核这是 Eclipse 开发工具的Java的核心部分。 它包含对编译和使用Java代码的非用户界面支持,包括:可以独立运行或者作为 Eclipse IDE的一部分的增量或者...
eclipse JDT的使用,非常使用的学习资源!!!
eclipse jdt, download from git.
Class not found: org.eclipse.jdt.core.JDTCompilerAdapter。 解决方法: 拷贝下面这些jar包到ant_home/lib org.eclipse.jdt.compiler.tool_1.0.100.v_972_R35x.jar org.eclipse.jdt.core_3.5.2.v_981_R35x.jar org...
Eclipse JDT AST使用方法,word格式的。Eclipse JDT是eclipse中开发Java程序的一套工具,包括editor,语法高亮等等功能,而其中的AST更是十分优秀的解析Java源代码的工具
NULL 博文链接:https://zhenghuazhi.iteye.com/blog/2090825
org.eclipse.jdt.* 的目录和文件 全部拷贝到 flexbuilder 的plugin (若为myEclipse则是将myEclipse下eclipse\plugins) flashbuilder也一样 ----下面是在FlexBuilder中配置VSS ------- 1. 首先绑定项目到...
方便eclipse调试JDK代码 实时查看JDK代码的值
tomcat 源码 ant 下载时用到的eclipse-JDT-3.3.1.zip
1.下载Eclipse plugin 补丁文件 org.eclipse.jdt.core_3.6.1.v_A68_R36x...7. 选择rt.jar,然后点击"Source Attachment"按钮,弹出对话框后选择"External File",然后把你的JDK安装目录下的src.zip文件与rt.jar关联上。
import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.Assignment; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt....
基于Eclipse-JDT生成Java源代码的AST并可视化
org.eclipse.jdt.core_3.8.3.v20130121-145325.jar (如果你没有,但是装了ecplise,可在 \eclipse\plugins中找到) [尤其是org.eclipse.jdt 这个jar包,不好找,网上下的几个不行。。。最后灵机一动,去ecplise...
NULL 博文链接:https://wu1g119.iteye.com/blog/2287940
eclipse.jdt.core 修改后的Eclipse JDT核心以解析存储库中的Java源代码
the guide of Eclipse JDT, from IBM; 随手填上了积分要求,不知该怎样取消,sigh
eclipse-JDT-3.2.2 免费下载 完全版eclipse-JDT-3.2.2 免费下载 完全版eclipse-JDT-3.2.2 免费下载 完全版eclipse-JDT-3.2.2 免费下载 完全版eclipse-JDT-3.2.2 免费下载 完全版eclipse-JDT-3.2.2 免费下载 完全版...
eclipse 自动生成的get set方法 自动加上文本注释,并且注释内容包含字段中我们加的文档注释