# 用Java实现JVM第十章《异常处理》

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

# 案例介绍

异常处理是java语言非常重要的一个语法,本章主要实现如何处理抛出的异常。

在Java语言中,异常可以分为两类:Checked异常和Unchecked异常。Unchecked异常包括java.lang.RuntimeException、java.lang.Error以及它们的子类,提前异常都是Checked异常。所有异常都最终继承自java.lang.Throwable。如果一个方法有可能导致Checked异常抛出,则该方法要么需要捕获该异常并妥善处理,要么必须把该异常列在自己的throws子句中,否则无法通过编译。Unchanged异常没有这个限制。请注意,Java虚拟机规范并没有这个规定,这只是Java语言的语法规则。

异常可以由Java虚拟机抛出,也可以由Java代码抛出。当Java虚拟机在运行过程中遇到比较严重的问题时,会抛出java.lang.Error的某个子类,如StackOverflowError、OutOfMemoryError等。程序一般无法从这种异常里恢复,所以在代码中通常也不必关心这类异常。

一部分执行在执行过程中会导致Java虚拟机抛出java.lang.RuntimeException的某个子类,如NullPointerException、IndexOutOfBoundsException等。这类异常一般是代码中的bug导致的,需要格外注意。在代码中抛出和处理异常是由athrow指令和方法的异常处理表配合完成的。

# 环境准备

  1. jdk 1.8.0
  2. IntelliJ IDEA Community Edition 2018.3.1 x64

# 配置信息

  1. 调试配置
    1. 配置位置:Run/Debug Configurations -> program arguments
    2. 配置内容:-Xjre "C:\Program Files\Java\jdk1.8.0_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-10\target\test-classes\org\itstack\demo\test\HelloWorld

# 代码示例

itstack-demo-jvm-10
├── pom.xml
└── src
    └── main
    │    └── java
    │        └── org.itstack.demo.jvm
    │             ├── _native
    │             │   ├── java
    │             │   │   ├── _Class.java
    │             │   │   ├── _Double.java
    │             │   │   ├── _Float.java
    │             │   │   ├── _Object.java
    │             │   │   ├── _String.java
    │             │   │   ├── _System.java
    │             │   │   └── _Throwable.java	
    │             │   └── sun	
    │             ├── NativeMethod.java
    │             └── Registry.java	
    │             ├── classfile
    │             │   ├── attributes   
    │             │   ├── constantpool 
    │             │   ├── ClassFile.java
    │             │   ├── ClassReader.java
    │             │   └── MemberInfo.java   
    │             ├── classpath
    │             │   ├── impl
    │             │   │   ├── CompositeEntry.java
    │             │   │   ├── DirEntry.java 
    │             │   │   ├── WildcardEntry.java 
    │             │   │   └── ZipEntry.java    
    │             │   ├── Classpath.java
    │             │   └── Entry.java   
    │             ├── classpath
    │             │   ├── base
    │             │   │   ├── BytecodeReader.java
    │             │   │   ├── ClassInitLogic.java
    │             │   │   ├── Instruction.java
    │             │   │   ├── InstructionBranch.java
    │             │   │   ├── InstructionIndex8.java
    │             │   │   ├── InstructionIndex16.java
    │             │   │   ├── InstructionNoOperands.java	
    │             │   │   └── MethodInvokeLogic.java
    │             │   ├── comparisons
    │             │   ├── constants
    │             │   ├── control
    │             │   ├── conversions
    │             │   ├── extended
    │             │   ├── loads
    │             │   ├── math
    │             │   ├── references
    │             │   │   ├── ANEW_ARRAY.java
    │             │   │   ├── ARRAY_LENGTH.java
    │             │   │   ├── ATHROW.java
    │             │   │   ├── CHECK_CAST.java
    │             │   │   ├── GET_FIELD.java
    │             │   │   ├── GET_STATIC.java
    │             │   │   ├── INSTANCE_OF.java
    │             │   │   ├── INVOKE_INTERFACE.java
    │             │   │   ├── INVOKE_SPECIAL.java
    │             │   │   ├── INVOKE_STATIC.java
    │             │   │   ├── INVOKE_VIRTUAL.java
    │             │   │   ├── MULTI_ANEW_ARRAY.java
    │             │   │   ├── NEW.java
    │             │   │   ├── NEW_ARRAY.java
    │             │   │   ├── PUT_FIELD.java
    │             │   │   └── PUT_STATIC.java
    │             │   ├── reserved
    │             │   │   └── INVOKE_NATIVE.java	
    │             │   ├── stack
    │             │   ├── store
    │             │   │   └── xastore
    │             │   │       ├── AASTORE.java	
    │             │   │       ├── BASTORE.java	
    │             │   │       ├── CASTORE.java	
    │             │   │       ├── DASTORE.java
    │             │   │       ├── FASTORE.java
    │             │   │       ├── IASTORE.java
    │             │   │       ├── LASTORE.java	
    │             │   │       └── SASTORE.java		
    │             │   └── Factory   
    │             ├── rtda
    │             │   ├── heap
    │             │   │   ├── constantpool
    │             │   │   ├── methodarea
    │             │   │   │   ├── Class.java    
    │             │   │   │   ├── ClassMember.java  
    │             │   │   │   ├── ExceptionTable.java  	
    │             │   │   │   ├── Field.java    
    │             │   │   │   ├── Method.java 
    │             │   │   │   ├── MethodDescriptor.java 
    │             │   │   │   ├── MethodDescriptorParser.java 
    │             │   │   │   ├── MethodLookup.java 	
    │             │   │   │   ├── Object.java   
    │             │   │   │   ├── Slots.java   
    │             │   │   │   └── StringPool.java	
    │             │   │   └── ClassLoader.java  
    │             │   ├── Frame.java
    │             │   ├── JvmStack.java
    │             │   ├── LocalVars.java
    │             │   ├── OperandStack.java
    │             │   ├── Slot.java 
    │             │   └── Thread.java
    │             ├── Cmd.java
    │             ├── Interpret.java    
    │             └── Main.java
    └── test
         └── java
             └── org.itstack.demo.test
                 └── HelloWorld.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

如下为新增代码:

ClassReader.java (优化)

/**
 * http://www.itstack.org
 * create by fuzhengwei on 2019/5/12
 * <p>
 * java虚拟机定义了u1、u2、u4三种数据类型来表示;1字节、2字节、4字节,无符号整数。
 * 在如下实现中,用增位方式表示无符号类型:
 * u1、u2可以用int类型存储,因为int类型是4字节
 * u4 需要用long类型存储,因为long类型是8字节
 */
public class ClassReader {

    private byte[] data;

    public ClassReader(byte[] data) {
        this.data = data;
    }

    //u1
    public int readUint8() {
        byte[] val = readByte(1);
        return byte2int(val);
    }

    //u2
    public int readUint16() {
        byte[] val = readByte(2);
        return byte2int(val);
    }

    //u4
    public long readUint32() {
        byte[] val = readByte(4);
        String str_hex = new BigInteger(1, val).toString(16);
        return Long.parseLong(str_hex, 16);
    }

    public int readUint32TInteger(){
        byte[] val = readByte(4);
        return new BigInteger(1, val).intValue();
    }

    public float readUint64TFloat() {
        byte[] val = readByte(8);
        return new BigInteger(1, val).floatValue();
    }

    public long readUint64TLong() {
        byte[] val = readByte(8);
        return new BigInteger(1, val).longValue();
    }

    public double readUint64TDouble() {
        byte[] val = readByte(8);
        return new BigInteger(1, val).doubleValue();
    }

    public int[] readUint16s() {
        int n = this.readUint16();
        int[] s = new int[n];
        for (int i = 0; i < n; i++) {
            s[i] = this.readUint16();
        }
        return s;
    }

    public byte[] readBytes(int n) {
        return readByte(n);
    }

    private byte[] readByte(int length) {
        byte[] copy = new byte[length];
        System.arraycopy(data, 0, copy, 0, length);
        System.arraycopy(data, length, data, 0, data.length - length);
        return copy;
    }

    private int byte2int(byte[] val) {
        String str_hex = new BigInteger(1, val).toString(16);
        return Integer.parseInt(str_hex, 16);
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

_Throwable.java

public class _Throwable {

    private StackTraceElement stackTraceElement;

    private final String jlThrowable = "java/lang/Throwable";

    public _Throwable() {
        Registry.register(jlThrowable, "fillInStackTrace", "(I)Ljava/lang/Throwable;", new NativeMethod(this, "fillInStackTrace"));
        Registry.register(jlThrowable, "registerNatives", "()V", new NativeMethod(this, "registerNatives"));
    }

    public void registerNatives(Frame frame) {
        // do nothing
    }

    public String string() {
        return String.format("%s.%s(%s:%d)", this.stackTraceElement.className, this.stackTraceElement.methodName, this.stackTraceElement.fileName, this.stackTraceElement.lineNumber);
    }

    public void fillInStackTrace(Frame frame) {
        Object thiz = frame.localVars().getThis();
        frame.operandStack().pushRef(thiz);

        _Throwable[] stes = createStackTraceElements(thiz, frame.thread());
        thiz.setExtra(stes);
    }

    private _Throwable[] createStackTraceElements(Object tObj, Thread thread) {
        int skip = distanceToObject(tObj.clazz()) + 2;
        Frame[] frames = thread.getFrames();
        _Throwable[] stes = new _Throwable[frames.length - skip];
        int idx = 0;
        for (int i = skip; i < frames.length; i++) {
            stes[idx] = createStackTraceElement(frames[i]);
        }
        return stes;
    }

    private int distanceToObject(Class clazz) {
        int distance = 0;
        for (Class c = clazz.superClass(); c != null; c = c.superClass()) {
            distance++;
        }
        return distance;
    }

    private _Throwable createStackTraceElement(Frame frame) {
        Method method = frame.method();
        Class clazz = method.clazz();
        StackTraceElement stackTraceElement = new StackTraceElement();
        stackTraceElement.fileName = clazz.sourceFile();
        stackTraceElement.className = clazz.javaName();
        stackTraceElement.methodName = method.name();
        stackTraceElement.lineNumber = method.getLineNumber(frame.nextPC() - 1);
        _Throwable throwable = new _Throwable();
        throwable.stackTraceElement = stackTraceElement;
        return throwable;
    }

    private class StackTraceElement {
        private String fileName;
        private String className;
        private String methodName;
        private int lineNumber;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

ATHROW.java

public class ATHROW extends InstructionNoOperands {

    @Override
    public void execute(Frame frame) {
        Object ex = frame.operandStack().popRef();
        if (ex == null) {
            throw new NullPointerException();
        }

        Thread thread = frame.thread();
        if (!findAndGotoExceptionHandler(thread, ex)) {
            handleUncaughtException(thread, ex);
        }
    }

    private boolean findAndGotoExceptionHandler(Thread thread, Object ex) {
        do {
            Frame frame = thread.currentFrame();
            int pc = frame.nextPC() - 1;

            int handlerPc = frame.method().findExceptionHandler(ex.clazz(), pc);
            if (handlerPc > 0) {
                OperandStack stack = frame.operandStack();
                stack.clear();
                stack.pushRef(ex);
                frame.setNextPC(handlerPc);
                return true;
            }

            thread.popFrame();
        } while (!thread.isStackEmpty());
        return false;
    }

    private void handleUncaughtException(Thread thread, Object ex) {
        thread.clearStack();

        Object jMsg = ex.getRefVar("detailMessage", "Ljava/lang/String;");

        String msg = StringPool.goString(jMsg);

        System.out.println(ex.clazz().javaName() + ":" + msg);

        java.lang.Object extra = ex.extra();

        _Throwable[] throwables = (_Throwable[]) extra;
        for (_Throwable t : throwables) {
            System.out.println(t.string());
        }

    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

ExceptionTable.java

public class ExceptionTable {

    private ExceptionHandler[] exceptionTable;

    public ExceptionTable(CodeAttribute.ExceptionTableEntry[] entries, RunTimeConstantPool runTimeConstantPool) {
        this.exceptionTable = new ExceptionHandler[entries.length];
        int i = 0;
        for (CodeAttribute.ExceptionTableEntry entry : entries) {
            ExceptionHandler handler = new ExceptionHandler(
                    entry.startPC(),
                    entry.endPC(),
                    entry.handlerPC(),
                    getCatchType(entry.catchType(), runTimeConstantPool)
            );
            this.exceptionTable[i++] = handler;
        }
    }

    public ClassRef getCatchType(int idx, RunTimeConstantPool runTimeConstantPool) {
        if (idx == 0) return null;
        return (ClassRef) runTimeConstantPool.getConstants(idx);
    }

    public ExceptionHandler findExceptionHandler(Class exClass, int pc) {
        for (ExceptionHandler handler : exceptionTable) {
            if (pc >= handler.startPC && pc < handler.endPC) {
                if (null == handler.catchType) {
                    return handler;
                }
                Class catchClass = handler.catchType.resolvedClass();
                if (catchClass == exClass || catchClass.isSubClassOf(exClass)) {
                    return handler;
                }
            }
        }
        return null;
    }


    class ExceptionHandler {

        int startPC;
        int endPC;
        int handlerPC;
        ClassRef catchType;

        ExceptionHandler(int startPC, int endPC, int handlerPC, ClassRef catchType) {
            this.startPC = startPC;
            this.endPC = endPC;
            this.handlerPC = handlerPC;
            this.catchType = catchType;
        }
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

Method.java

public class Method extends ClassMember {

    public int maxStack;
    public int maxLocals;
    public byte[] code;
    private ExceptionTable exceptionTable;
    private LineNumberTableAttribute lineNumberTable;
    private int argSlotCount;

    Method[] newMethods(Class clazz, MemberInfo[] cfMethods) {
        Method[] methods = new Method[cfMethods.length];
        for (int i = 0; i < cfMethods.length; i++) {
            methods[i] = newMethod(clazz, cfMethods[i]);
        }
        return methods;
    }

    private Method newMethod(Class clazz, MemberInfo cfMethod) {
        Method method = new Method();
        method.clazz = clazz;
        method.copyMemberInfo(cfMethod);
        method.copyAttributes(cfMethod);
        MethodDescriptor md = MethodDescriptorParser.parseMethodDescriptorParser(method.descriptor);
        method.calcArgSlotCount(md.parameterTypes);
        if (method.isNative()) {
            method.injectCodeAttribute(md.returnType);
        }
        return method;
    }

    private void injectCodeAttribute(String returnType) {
        this.maxStack = 4; //todo
        this.maxLocals = this.argSlotCount;

        switch (returnType.getBytes()[0]) {
            case 'V':
                this.code = new byte[]{(byte) 0xfe, (byte) 0xb1};
                break;
            case 'L':
            case '[':
                this.code = new byte[]{(byte) 0xfe, (byte) 0xb0};
                break;
            case 'D':
                this.code = new byte[]{(byte) 0xfe, (byte) 0xaf};
                break;
            case 'F':
                this.code = new byte[]{(byte) 0xfe, (byte) 0xae};
                break;
            case 'J':
                this.code = new byte[]{(byte) 0xfe, (byte) 0xad};
                break;
            default:
                this.code = new byte[]{(byte) 0xfe, (byte) 0xac};
                break;
        }
    }

    private void copyAttributes(MemberInfo cfMethod) {
        CodeAttribute codeAttr = cfMethod.codeAttribute();
        if (null != codeAttr) {
            this.maxStack = codeAttr.maxStack();
            this.maxLocals = codeAttr.maxLocals();
            this.code = codeAttr.data();
            this.lineNumberTable = codeAttr.lineNumberTableAttribute();
            this.exceptionTable = new ExceptionTable(codeAttr.exceptionTable(), this.clazz.constantPool());
        }
    }

    private void calcArgSlotCount(List<String> parameterTypes) {
        for (String paramType : parameterTypes) {
            this.argSlotCount++;
            if ("J".equals(paramType) || "D".equals(paramType)) {
                this.argSlotCount++;
            }
        }
        if (!this.isStatic()) {
            this.argSlotCount++;
        }
    }

    public boolean isSynchronized() {
        return 0 != (this.accessFlags & AccessFlags.ACC_SYNCHRONIZED);
    }

    public boolean isBridge() {
        return 0 != (this.accessFlags & AccessFlags.ACC_BRIDGE);
    }

    public boolean isVarargs() {
        return 0 != (this.accessFlags & AccessFlags.ACC_VARARGS);
    }

    public boolean isNative() {
        return 0 != (this.accessFlags & AccessFlags.ACC_NATIVE);
    }

    public boolean isAbstract() {
        return 0 != (this.accessFlags & AccessFlags.ACC_ABSTRACT);
    }

    public boolean isStrict() {
        return 0 != (this.accessFlags & AccessFlags.ACC_STRICT);
    }

    public int maxStack() {
        return this.maxStack;
    }

    public int maxLocals() {
        return this.maxLocals;
    }

    public byte[] code() {
        return this.code;
    }

    public int argSlotCount() {
        return this.argSlotCount;
    }

    public int findExceptionHandler(Class exClass, int pc) {
        ExceptionTable.ExceptionHandler handler = this.exceptionTable.findExceptionHandler(exClass, pc);
        if (handler != null) {
            return handler.handlerPC;
        }
        return -1;
    }

    public int getLineNumber(int pc) {
        if (this.isNative()) return -2;
        if (this.lineNumberTable == null) return -1;
        return this.lineNumberTable.getLineNumber(pc);
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

HelloWorld.java

public class HelloWorld {

    public static void main(String[] args) {
        throw new RuntimeException("自定义异常");
    }

}
1
2
3
4
5
6
7

# 测试结果

-Xjre "C:\Program Files\Java\jdk1.8.0_161\jre" E:\itstack\git\istack-demo\itstack-demo-jvm\itstack-demo-jvm-10\target\test-classes\org\itstack\demo\test\HelloWorld -verbose

public class org.itstack.demo.test.HelloWorld {
  public org.itstack.demo.test.HelloWorld();
    Code:
       0: aload_0           
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/lang/RuntimeException
       3: dup
       4: ldc           #3                  // String 自定义异常
       6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
       9: athrow
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x12 -> LDC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader0() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb4 -> GET_FIELD
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.getClassLoader() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.getClassLoader() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.getClassLoader() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.getClassLoader() 	寄存器(指令)0x01 -> ACONST_NULL
java/lang/Class.getClassLoader() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Class.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Class.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Class.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Class.<clinit>() 	寄存器(指令)0x04 -> ICONST_1
java/lang/Class.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Class.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Class.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Class.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Class.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Class.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Class.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xac -> IRETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xac -> IRETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x9a -> IFNE
java/lang/Throwable.<clinit>() 	寄存器(指令)0x04 -> ICONST_1
java/lang/Throwable.<clinit>() 	寄存器(指令)0xa7 -> GOTO
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/util/ArrayList.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/util/ArrayList.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/util/ArrayList.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/util/ArrayList.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/util/ArrayList.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/util/ArrayList.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/util/ArrayList.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Throwable.<clinit>() 	寄存器(指令)0x59 -> DUP
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0x03 -> ICONST_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/AbstractList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9e -> IFLE
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9a -> IFNE
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb2 -> GET_STATIC
java/util/ArrayList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/ArrayList.<init>() 	寄存器(指令)0xa7 -> GOTO
java/util/ArrayList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/util/Collections.<clinit>() 	寄存器(指令)0x59 -> DUP
java/util/Collections.<clinit>() 	寄存器(指令)0x01 -> ACONST_NULL
java/util/Collections.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractSet.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractSet.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractSet.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptySet.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/util/Collections.<clinit>() 	寄存器(指令)0x59 -> DUP
java/util/Collections.<clinit>() 	寄存器(指令)0x01 -> ACONST_NULL
java/util/Collections.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0x03 -> ICONST_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/AbstractList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptyList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xbb -> NEW
java/util/Collections.<clinit>() 	寄存器(指令)0x59 -> DUP
java/util/Collections.<clinit>() 	寄存器(指令)0x01 -> ACONST_NULL
java/util/Collections.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractMap.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractMap.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractMap.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$EmptyMap.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/util/Collections.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xc1 -> INSTANCE_OF
java/util/Collections.unmodifiableList() 	寄存器(指令)0x99 -> IFEQ
java/util/Collections.unmodifiableList() 	寄存器(指令)0xbb -> NEW
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Object.registerNatives() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Object.registerNatives() 	寄存器(指令)0xb1 -> RETURN
java/lang/Object.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.unmodifiableList() 	寄存器(指令)0xbb -> NEW
java/util/Collections.unmodifiableList() 	寄存器(指令)0x59 -> DUP
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xc7 -> IFNONNULL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x12 -> LDC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader0() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb4 -> GET_FIELD
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.getClassLoader() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.getClassLoader() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.getClassLoader() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.getClassLoader() 	寄存器(指令)0x01 -> ACONST_NULL
java/lang/Class.getClassLoader() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xac -> IRETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xac -> IRETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x9a -> IFNE
java/lang/Throwable.<clinit>() 	寄存器(指令)0x04 -> ICONST_1
java/lang/Throwable.<clinit>() 	寄存器(指令)0xa7 -> GOTO
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Throwable.<clinit>() 	寄存器(指令)0x59 -> DUP
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0x03 -> ICONST_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/AbstractList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9e -> IFLE
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9a -> IFNE
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb2 -> GET_STATIC
java/util/ArrayList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/ArrayList.<init>() 	寄存器(指令)0xa7 -> GOTO
java/util/ArrayList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xc1 -> INSTANCE_OF
java/util/Collections.unmodifiableList() 	寄存器(指令)0x99 -> IFEQ
java/util/Collections.unmodifiableList() 	寄存器(指令)0xbb -> NEW
java/util/Collections.unmodifiableList() 	寄存器(指令)0x59 -> DUP
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xc7 -> IFNONNULL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x12 -> LDC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Class.getClassLoader0() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb4 -> GET_FIELD
java/lang/Class.getClassLoader0() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.getClassLoader() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.getClassLoader() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.getClassLoader() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.getClassLoader() 	寄存器(指令)0x01 -> ACONST_NULL
java/lang/Class.getClassLoader() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x4c -> ASTORE_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Class.desiredAssertionStatus0() 	寄存器(指令)0xac -> IRETURN
java/lang/Class.desiredAssertionStatus() 	寄存器(指令)0xac -> IRETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0x9a -> IFNE
java/lang/Throwable.<clinit>() 	寄存器(指令)0x04 -> ICONST_1
java/lang/Throwable.<clinit>() 	寄存器(指令)0xa7 -> GOTO
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbb -> NEW
java/lang/Throwable.<clinit>() 	寄存器(指令)0x59 -> DUP
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/AbstractCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/AbstractList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/AbstractList.<init>() 	寄存器(指令)0x03 -> ICONST_0
java/util/AbstractList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/AbstractList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9e -> IFLE
java/util/ArrayList.<init>() 	寄存器(指令)0x1b -> ILOAD_1
java/util/ArrayList.<init>() 	寄存器(指令)0x9a -> IFNE
java/util/ArrayList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/ArrayList.<init>() 	寄存器(指令)0xb2 -> GET_STATIC
java/util/ArrayList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/ArrayList.<init>() 	寄存器(指令)0xa7 -> GOTO
java/util/ArrayList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb8 -> INVOKE_STATIC
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xc1 -> INSTANCE_OF
java/util/Collections.unmodifiableList() 	寄存器(指令)0x99 -> IFEQ
java/util/Collections.unmodifiableList() 	寄存器(指令)0xbb -> NEW
java/util/Collections.unmodifiableList() 	寄存器(指令)0x59 -> DUP
java/util/Collections.unmodifiableList() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xc7 -> IFNONNULL
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableCollection.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/util/Collections$UnmodifiableList.<init>() 	寄存器(指令)0xb1 -> RETURN
java/util/Collections.unmodifiableList() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.<clinit>() 	寄存器(指令)0xbd -> ANEW_ARRAY
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb3 -> PUT_STATIC
java/lang/Throwable.<clinit>() 	寄存器(指令)0xb1 -> RETURN
org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0xbb -> NEW
org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0x59 -> DUP
org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0x12 -> LDC
org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/RuntimeException.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/RuntimeException.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/RuntimeException.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Exception.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Exception.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Exception.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Object.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0xb2 -> GET_STATIC
java/lang/Throwable.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0xb2 -> GET_STATIC
java/lang/Throwable.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0xb6 -> INVOKE_VIRTUAL
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb4 -> GET_FIELD
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xc7 -> IFNONNULL
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x03 -> ICONST_0
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb7 -> INVOKE_SPECIAL
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xfe -> INVOKE_NATIVE
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x57 -> POP
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb2 -> GET_STATIC
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb5 -> PUT_FIELD
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.fillInStackTrace() 	寄存器(指令)0xb0 -> ARETURN
java/lang/Throwable.<init>() 	寄存器(指令)0x57 -> POP
java/lang/Throwable.<init>() 	寄存器(指令)0x2a -> ALOAD_0
java/lang/Throwable.<init>() 	寄存器(指令)0x2b -> ALOAD_1
java/lang/Throwable.<init>() 	寄存器(指令)0xb5 -> PUT_FIELD
java/lang/Throwable.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/Exception.<init>() 	寄存器(指令)0xb1 -> RETURN
java/lang/RuntimeException.<init>() 	寄存器(指令)0xb1 -> RETURN
org/itstack/demo/test/HelloWorld.main() 	寄存器(指令)0xbf -> ATHROW
java.lang.RuntimeException:自定义异常
org.itstack.demo.test.HelloWorld.main(HelloWorld.java:9)

Process finished with exit code 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423

微信搜索「bugstack虫洞栈」公众号,关注后回复「用Java实现jvm源码」获取本文源码&更多原创专题案例!