/** Access codes for dereferencing(解引用), assignment,
 * and pre/post increment/decrement.
 * Access codes for assignment operations are determined
 * by method accessCode below.
 *
 *  All access codes for accesses to the current class are even. 都是偶数
 *  If a member of the superclass should be accessed instead (because
 *  access was via a qualified super), add one to the corresponding code
 *  for the current class, making the number odd.
 *  This numbering scheme is used by the backend to decide whether
 *  to issue an invokevirtual or invokespecial call.
 *  后端使用他的编号方案来决定是否发出一个invokevirtual或invokespecial call。
 *  @see Gen.visitSelect(Select tree)
 */
// 关于invokevirtual与invokespecial指令相关介绍:
// https://www.cnblogs.com/extjs4/p/9103190.html
// 如下的编号都为偶数
private static final int
    DEREFcode = 0, // deref
    ASSIGNcode = 2, // assign
    PREINCcode = 4, // preinc
    PREDECcode = 6, // predec
    POSTINCcode = 8, // postinc
    POSTDECcode = 10, // postdec
    FIRSTASGOPcode = 12; // first assignment op

定义了accessCode为:0、2、4、6、8、10、12

举个例子,如下:

class TestAccessPrivateVar {
	private int a = 1;
	class MyInner {
		public void t() {
			int b = a; // deref
			a = 2;   // assign
			int c;
			c = ++a; // preinc
			c = --a; // predec
			c = a++; // postinc
			c = a--; // postdec
			a += 1; // first assignment op
		}
	}
}
iadd            = 96,// 0x60	iadd	将栈顶两int型数值相加并将结果压入栈顶
ladd            = 97,// 0x61	ladd	将栈顶两long型数值相加并将结果压入栈顶
fadd            = 98,// 0x62	fadd	将栈顶两float型数值相加并将结果压入栈顶
dadd            = 99,// 0x63	dadd	将栈顶两double型数值相加并将结果压入栈顶
isub            = 100,// 0x64	is	    将栈顶两int型数值相减并将结果压入栈顶
lsub            = 101,// 0x65	ls	    将栈顶两long型数值相减并将结果压入栈顶
fsub            = 102,// 0x66	fs	    将栈顶两float型数值相减并将结果压入栈顶
dsub            = 103,// 0x67	ds	    将栈顶两double型数值相减并将结果压入栈顶
imul            = 104,// 0x68	imul	将栈顶两int型数值相乘并将结果压入栈顶
lmul            = 105,// 0x69	lmul	将栈顶两long型数值相乘并将结果压入栈顶
fmul            = 106,// 0x6a	fmul	将栈顶两float型数值相乘并将结果压入栈顶
dmul            = 107,// 0x6b	dmul	将栈顶两double型数值相乘并将结果压入栈顶
idiv            = 108,// 0x6c           将栈顶两int型数值相除并将结果压入栈顶
ldiv            = 109,// 0x6d	ldiv	将栈顶两long型数值相除并将结果压入栈顶
fdiv            = 110,// 0x6e	fdiv	将栈顶两float型数值相除并将结果压入栈顶
ddiv            = 111,// 0x6f	ddiv	将栈顶两double型数值相除并将结果压入栈顶
imod            = 112,// 0x70	irem	将栈顶两int型数值作取模运算并将结果压入栈顶
lmod            = 113,// 0x71	lrem	将栈顶两long型数值作取模运算并将结果压入栈顶
fmod            = 114,// 0x72	frem	将栈顶两float型数值作取模运算并将结果压入栈顶
dmod            = 115,// 0x73	drem	将栈顶两double型数值作取模运算并将结果压入栈顶
ineg            = 116,// 0x74	ineg	将栈顶int型数值取负并将结果压入栈顶
lneg            = 117,// 0x75	lneg	将栈顶long型数值取负并将结果压入栈顶
fneg            = 118,// 0x76	fneg	将栈顶float型数值取负并将结果压入栈顶
dneg            = 119,// 0x77	dneg	将栈顶double型数值取负并将结果压入栈顶

ishl            = 120,// 0x78	ishl	将int型数值左移位指定位数并将结果压入栈顶
lshl            = 121,// 0x79	lshl	将long型数值左移位指定位数并将结果压入栈顶
ishr            = 122,// 0x7a	ishr	将int型数值右(符号)移位指定位数并将结果压入栈顶
lshr            = 123,// 0x7b	lshr	将long型数值右(符号)移位指定位数并将结果压入栈顶
iushr           = 124,// 0x7c	iushr	将int型数值右(无符号)移位指定位数并将结果压入栈顶
lushr           = 125,// 0x7d	lushr	将long型数值右(无符号)移位指定位数并将结果压入栈顶

iand            = 126,// 0x7e	iand	将栈顶两int型数值作“按位与”并将结果压入栈顶
land            = 127,// 0x7f	land	将栈顶两long型数值作“按位与”并将结果压入栈顶
ior             = 128,// 0x80	ior	将栈顶两int型数值作“按位或”并将结果压入栈顶
lor             = 129,// 0x81	lor	将栈顶两long型数值作“按位或”并将结果压入栈顶
ixor            = 130,// 0x82	ixor	将栈顶两int型数值作“按位异或”并将结果压入栈顶
lxor            = 131,// 0x83	lxor	将栈顶两long型数值作“按位异或”并将结果压入栈顶

算出来的accessCode为:12、14、16 ... 80 、 82

int string_add      = 256,  // string +

算出来的accessCode为:84

 int ishll           = 270,  // int shift left with long count 向左移动,移动类型为long
        lshll           = 271,  // long shift left with long count
        ishrl           = 272,  // int shift right with long count
        lshrl           = 273,  // long shift right with long count
        iushrl          = 274,  // int unsigned shift right with long count
        lushrl          = 275;  // long unsigned shift right with long count 例如>>>

算出来的accessCode为:86、88、... 96  

  

 

lower类的accessCode解读的更多相关文章

  1. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  2. java.lang.String 类源码解读

    String类定义实现了java.io.Serializable, Comparable<String>, CharSequence 三个接口:并且为final修饰. public fin ...

  3. java.lang.Long 类源码解读

    总体阅读了Long的源码,基本跟Integer类类似,所以特别全部贴出源码,直接注释进行理解. // final修饰符 public final class Long extends Number i ...

  4. 【QT相关】类头文件解读、QT编辑模式、读取text文本

    Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...

  5. SimpleVisitorMemberType类的visitClassType解读

    举个例子,如下: class CA<T>{ public T getVal(){ return null; } } interface IA{} interface IB{} public ...

  6. python装饰器2:类装饰器

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...

  7. Volley 框架解析(二)--RequestQueue核心解读

    主要围绕RequestQueue进行解读,它的两个请求队列CacheQueue.NetworkQueue是如何调用的,第一条请求的执行过程及如何处理重复请求?对RequestQueue及相关的类进行详 ...

  8. Large Class--过大的类--要重构的信号

    如果想利用单个类做太多事情,其内往往就会出现太多实例变量.一旦如此,Duplicated Code也就接踵而至.     解决方法:     1.将类内彼此相关的变量,将它们放在一起.使用Extrac ...

  9. TypeScript完全解读(26课时)_汇总贴

    ECMAScript 6 入门:http://es6.ruanyifeng.com/ 官网:http://www.typescriptlang.org/ 中文网:https://www.tslang. ...

随机推荐

  1. struts2从浅之深(一)简介

    一.Struts2简介 1.Struts2概述                    Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. M:model-----数据 ...

  2. underscore chain

    //可以在面向对象或者函数的风格下使用Underscore_.map([1, 2, 3], function(n){ return n * 2; }); //一般习惯用这种 _([1, 2, 3]). ...

  3. VSTO学习笔记

    文档类型程序发布: 安装.NetFrameWork Visual Studio 2010 Tools for Office Runtime 4.0下载地址: http://www.microsoft. ...

  4. LeetCode133:Clone Graph

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  5. [翻译]NUnit---RequiresSTA and RequiresThread Attributes(十七)

    RequiresSTAAttribute (NUnit 2.5) RequiresSTA特性用于测试方法.类.程序集中指定测试应该在单线程中运行.如果父测试不在单线程中运行则会创建一个新的线程. No ...

  6. [翻译]NUnit---RequiredAddin and RequiresMTA Attributes(十六)

    RequiredAddinAttribute (NUnit 2.5) RequiredAddin特性用于提示一个程序集需要特殊的插件才能保证功能正常.如果没有安装插件,整个程序集会被标记为未运行. N ...

  7. C#之数据类型学习

    C#有以下几种数据类型: 数据类型案例以及取值范围: 界面: 选择int时: 选中long时: 选中float时: 选中double时: 选中decimal时: 选中string时: 选中char时: ...

  8. C# 实现邮件代发

    由于自己很好奇,有一些推广之类的 邮件,发件人后面,都有一个 由 .... 代发. 所以,查找了一些资料,来验证了一下实现方法. 咱们先来看看,实现代发的 理想效果图 当然,这一种,是利用 代发的 邮 ...

  9. .net core初试 --- 控制台程序

    .net core这个名字对.net程序员来说都不陌生了,但貌似圈子里真正有开发经验的并不多,关键是公司的项目没需求. 今天我就趁着不忙上手玩了玩,搞明白了一些东西,心中也有了十万个为什么.那么现在与 ...

  10. The service definition selected is invalid

    吐槽下 最近在学Java 听闻Java生态很好 社区很多 但实际操作起来确实另一番风景 不多说了 说正事 添加WebService服务Client时有密码认证得服务 Eclipse抛出 The ser ...