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字符集 解读:万国码,无需转码,无乱码风险,节省 ...
随机推荐
- 挂载镜像SD卡的FAT32文件系统分区到Linux中
首先使用fdisk –l命令查看sd卡的分区息 可以看到,sd卡有三个分区,第一个分区是FAT32系统,主要存放内核img文件和dtb文件,第二个分区是Linux系统分区,第三个分区格式未知,实际是U ...
- js 面向对象 继承机制
根据w3cschool上的描述:共有3种继承方法(对象冒充,原型链,混合) 1.对象冒充:构造函数ClassA使用this关键字给所有属性和方法赋值,使ClassA构造函数成为ClassB的方法,调用 ...
- A Good Story for Great Friends
There once was a little girl who had a bad temper. Her mother gave her a bag of nails and told her t ...
- Java程序性能定位工具-火焰图
Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...
- 【算法30】从数组中选择k组长度为m的子数组,要求其和最小
原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...
- Excel中使用VBA进行度分秒与十进制度的转换
发现Excel的VBA功能真是批量处理的一把利刃,工作中小试牛刀了一把,将Excel中度分秒形式的坐标批量处理成十进制度形式,处理完后用于GIS展点制图. 原Excel数据如下: VBA代码如下: S ...
- Immutable Collections(3)Immutable List实现原理(中)变化中的不变
Immutable Collections(3)Immutable List实现原理(中)变化中的不变 文/玄魂 前言 在上一篇文章(Immutable Collections(2)Immutabl ...
- linux系统编程:setjmp和longjmp函数用法
#include <stdio.h> #include <setjmp.h> //jmp_buf:数组,保存栈信息即运行环境 jmp_buf buf; double Divid ...
- Spring Boot 2 实践记录之 条件装配
实验项目是想要使用多种数据库访问方式,比如 JPA 和 MyBatis. 项目的 Service 层业务逻辑相同,只是具体实现代码不同,自然是一组接口,两组实现类的架构比较合理. 不过这种模式却有一个 ...
- C# DataTable导出EXCEL后身份证、银行卡号等长数字信息显示乱码解决
在DataTable导出EXCEL后发现有些格式显示有问题,比如身份证.银行卡号等大于11位的数字显示为科学计数法.13681-1等 带中划线的两段数字显示为日期格式等. 处理方法如下: public ...