LetExpr表达式解读
Integer a = 0; a++;
举个例子,如下:
package com.test19; public class BugReport<T> { private T n; public void error() { BugReport<Integer> val = new BugReport<Integer>(); val.n = 0; Integer.toString(val.n++); } public static void main(String[] args) { BugReport.class.getMethods(); } }
经过反编译后如下:
package com.test19; public class BugReport<T> { private T n; public BugReport() { } public void error() { BugReport var1 = new BugReport(); var1.n = Integer.valueOf(0); Integer var3 = (Integer)var1.n; Object var4 = var1.n = Integer.valueOf(((Integer)var1.n).intValue() + 1); Integer.toString(var3.intValue()); } public static void main(String[] var0) { BugReport.class.getMethods(); } }
生成的class文件格式如下:
Classfile /C:/BugReport.class Last modified 2018-7-22; size 741 bytes MD5 checksum 3c3412b5bb98381c1e3035573f40b89c Compiled from "BugReport.java" public class com.test19.BugReport<T extends java.lang.Object> extends java.lang.Object Signature: #22 // <T:Ljava/lang/Object;>Ljava/lang/Object; SourceFile: "BugReport.java" minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #10.#25 // java/lang/Object."<init>":()V #2 = Class #26 // com/test19/BugReport #3 = Methodref #2.#25 // com/test19/BugReport."<init>":()V #4 = Methodref #6.#27 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer; #5 = Fieldref #2.#28 // com/test19/BugReport.n:Ljava/lang/Object; #6 = Class #29 // java/lang/Integer #7 = Methodref #6.#30 // java/lang/Integer.intValue:()I #8 = Methodref #6.#31 // java/lang/Integer.toString:(I)Ljava/lang/String; #9 = Methodref #32.#33 // java/lang/Class.getMethods:()[Ljava/lang/reflect/Method; #10 = Class #34 // java/lang/Object #11 = Utf8 n #12 = Utf8 Ljava/lang/Object; #13 = Utf8 Signature #14 = Utf8 TT; #15 = Utf8 <init> #16 = Utf8 ()V #17 = Utf8 Code #18 = Utf8 LineNumberTable #19 = Utf8 error #20 = Utf8 main #21 = Utf8 ([Ljava/lang/String;)V #22 = Utf8 <T:Ljava/lang/Object;>Ljava/lang/Object; #23 = Utf8 SourceFile #24 = Utf8 BugReport.java #25 = NameAndType #15:#16 // "<init>":()V #26 = Utf8 com/test19/BugReport #27 = NameAndType #35:#36 // valueOf:(I)Ljava/lang/Integer; #28 = NameAndType #11:#12 // n:Ljava/lang/Object; #29 = Utf8 java/lang/Integer #30 = NameAndType #37:#38 // intValue:()I #31 = NameAndType #39:#40 // toString:(I)Ljava/lang/String; #32 = Class #41 // java/lang/Class #33 = NameAndType #42:#43 // getMethods:()[Ljava/lang/reflect/Method; #34 = Utf8 java/lang/Object #35 = Utf8 valueOf #36 = Utf8 (I)Ljava/lang/Integer; #37 = Utf8 intValue #38 = Utf8 ()I #39 = Utf8 toString #40 = Utf8 (I)Ljava/lang/String; #41 = Utf8 java/lang/Class #42 = Utf8 getMethods #43 = Utf8 ()[Ljava/lang/reflect/Method; { public com.test19.BugReport(); flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 3: 0 public void error(); flags: ACC_PUBLIC Code: stack=3, locals=5, args_size=1 0: new #2 // class com/test19/BugReport 3: dup 4: invokespecial #3 // Method "<init>":()V 7: astore_1 8: aload_1 9: iconst_0 10: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 13: putfield #5 // Field n:Ljava/lang/Object; 16: aload_1 17: astore_2 18: aload_2 19: getfield #5 // Field n:Ljava/lang/Object; 22: checkcast #6 // class java/lang/Integer 25: astore_3 26: aload_2 27: aload_2 28: getfield #5 // Field n:Ljava/lang/Object; 31: checkcast #6 // class java/lang/Integer 34: invokevirtual #7 // Method java/lang/Integer.intValue:()I 37: iconst_1 38: iadd 39: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 42: dup_x1 43: putfield #5 // Field n:Ljava/lang/Object; 46: astore 4 48: aload_3 49: invokevirtual #7 // Method java/lang/Integer.intValue:()I 52: invokestatic #8 // Method java/lang/Integer.toString:(I)Ljava/lang/String; 55: pop 56: return LineNumberTable: line 8: 0 line 9: 8 line 10: 16 line 11: 56 public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=1, args_size=1 0: ldc_w #2 // class com/test19/BugReport 3: invokevirtual #9 // Method java/lang/Class.getMethods:()[Ljava/lang/reflect/Method; 6: pop 7: return LineNumberTable: line 14: 0 line 15: 7 }
LetExpr表达式解读的更多相关文章
- quartz Cron表达式解读
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...
- MySQL数据库25条规范解读
一.基础规范 (1)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省空间(由于移动设备原因最好使用utf8mb4) (2)禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...
- 58到家mysql数据库军规及解读分享
一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...
- MySQL30条规范解读
转载自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959906&idx=1&sn=2cbdc66cfb ...
- 转 SQL 的数据库 架构规范 之 58到家数据库30条军规解读
军规适用场景:并发量大.数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存 ...
- js小技巧(一)
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...
- Mysql 30条军规
一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...
- jmeter主要函数助手功用说明
jmeter中虽然有很多的插件,但是有些需要安装,有些具有一定的局限性.函数助手是一个快捷的工具库.下面记录一下函数助手中一些主要的函数的使用方法. 注:不内容中所有的实例均基于3.2记录 1._Be ...
- MySQL建表规范
一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...
随机推荐
- 17)maven-surefire-plugin
http://maven.apache.org/surefire/maven-surefire-plugin/ Goals Overview The Surefire Plugin has only ...
- wadl 的自动生成(cxf版本2.7.6)
参考文档 http://cxf.apache.org/docs/jaxrs-services-description.html 获取项目 git@github.com:witaste/cxf-2.7. ...
- obj-c的优缺点
优点: 1) Cateogies : 类别 2) Posing : 扮演 3) 动态识别 : 编译时与运行时动态识别类型 4) 指标计算 : 指针计算 指针的 +- * / 5) 弹性信息传递 : 某 ...
- VS 附加不上w3wp.exe
今天调用VS 附加不上w3wp.exe,其他的站点都能附加上,就有一个站附加不上,找了各种可能都没有解决,结果发现是版本被编译成release了,原来的配置都是debug的,不知道被谁给改成relea ...
- (并查集) Wireless Network --POJ --2236
链接: http://poj.org/problem?id=2236 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...
- MFC自动生成代码详解(一)
首先声明这篇博客是给MFC刚刚上路的coder准备的,老鸟们就自觉无视我吧! 大家有没有感觉,创建MFC工程时他总会生成一大堆文件一大堆代码.虽然给我们带来了便利,但是调试的时候碰到这些代码总是畏首畏 ...
- Bellman_ford货币兑换——正权回路判断
POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...
- IIS配置404页面配置,IIS自定义404页面
.NET 环境下 用到404页的场景一般有两种: 场景一:报黄页,程序性的错误,代码层可以捕捉到的. 场景二:用户输入不存在的页面,代码层捕捉不到的. IIS 默认会有404的配置,不过这种呈现出的都 ...
- ASP.NET Core学习总结(1)
经过那么长时间的学习,终于想给自己这段时间的学习工作做个总结了.记得刚开始学习的时候,什么资料都没有,光就啃文档.不过,值得庆幸的是,自己总算还有一些Web开发的基础.至少ASP.NET的WebFor ...
- 《JavaScript》高级程序设计第7章 函数表达式
7.2 闭包 定义: 闭包是指有权访问另一个函数作用域中的变量的函数. 理解闭包: 作用域链: 当某个函数被调用时,会创建一个执行环境以及相应的作用域链. 作用域链中,外部函数的活动对象始终处于第二位 ...