使用javap分析Java字节码的一个例子

I have the following source code in Java:

class Outer {
    Nested nested;
    Nested getNested() {
        return nested;
    }
}
class Nested {
    Inner inner;
    Inner getInner() {
        return inner;
    }
}
class Inner {
    String foo;
    String getFoo() {
        return foo;
    }
}


public class NullableTest {
    public static Outer getInitializedOuter(){
        Outer outer = new Outer();
        outer.nested = new Nested();
        outer.nested.inner = new Inner();
        outer.nested.inner.foo = "Jerry";
        return outer;
    }
    
    /* null pointer exception
private static void way0(){
        Outer outer = new Outer();
        System.out.println(outer.nested.inner.foo);
    }*/
    public static void way1(){
        Outer outer = getInitializedOuter();
        if (outer != null && outer.nested != null && outer.nested.inner != null) {
            System.out.println(outer.nested.inner.foo);
        }
    }

    public static void main(String[] args) {
        //way0();
        way1();
    }
}

使用javap分析Java字节码的一个例子使用javap分析Java字节码的一个例子According to instruction list explanation in wiki:


0: invokestatic #42 // Method getInitializedOuter:()Ljava8/Outer;

Call static method getInitializedOuter, whose return type is Outer

3: astore_0

Store returned Outer reference to local variable with id 0

4: aload_0

Since in Java source code, the reference outer will be compared against null via outer != null, so here aload_0 loads the reference stored in local variable #0 to stack.

5: ifnull 41

If the current value is null, execution will go to code #41, which is directly return.使用javap分析Java字节码的一个例子使用javap分析Java字节码的一个例子使用javap分析Java字节码的一个例子使用javap分析Java字节码的一个例子LineNumberTable is one of the optional attributes that holds metadata for debugging purposes. In this case, it specifies which offsets in the bytecode correspond to each line in the original source code. This is useful for printing more informative stack traces and for providing features like single step in the debugger. The example above illustrates the mapping relationship from byte code and original source code.


When change way1 from public to private, in javap output you cannot find byte code for way1() itself any more.


上一篇:mysql下sql语句 update 字段=字段+字符串


下一篇:DNGuard 免费的DotNet加密保护工具 V1.0