首页 > 其他 > 详细

三目运算符与字节码阅读

时间:2021-04-22 09:19:36      阅读:35      评论:0      收藏:0      [点我收藏+]

1

https://blog.csdn.net/weixin_39965161/article/details/112650387

技术分享图片

 

 

2

package agent;

/**
 * Created by mac on 2021/4/21.
 */
import jdk.internal.org.objectweb.asm.ClassReader;
import jdk.internal.org.objectweb.asm.util.TraceClassVisitor;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

public class Main {
    public static void main(String []f)throws IOException {
        //getDouble();
        InputStream is = Main.class.getResourceAsStream("Main.class");
        ClassReader cr =new ClassReader(is);
        cr.accept(new TraceClassVisitor(new PrintWriter(System.out)),0);
    }

    private static Double getDouble() {
        Double test =null;
        System.out.println(test !=null);
        /**
         *    L4
         *    LINENUMBER 21 L4
         *    ALOAD 0
         *    IFNULL L5
         *    ALOAD 0
         *    INVOKEVIRTUAL java/lang/Double.doubleValue ()D              // test拆箱應對Math.abs(double)
         *    INVOKESTATIC java/lang/Math.abs (D)D                        // 執行Math.abs
         *    GOTO L6
         *    L5
         *    FRAME SAME
         *    ALOAD 0
         *    INVOKEVIRTUAL java/lang/Double.doubleValue ()D              // test拆箱應對三目運算符返回類型double
         */
        return test !=null ? Math.abs(test) : test;
        /**
         *    L6
         *    FRAME SAME1 D
         *    INVOKESTATIC java/lang/Double.valueOf (D)Ljava/lang/Double;  // 對三目double的返回值裝箱,應對方法返回類型Double
         *    ARETURN
         *    L7
         *    LOCALVARIABLE test Ljava/lang/Double; L1 L7 0                // 方法返回
         *    MAXSTACK = 2
         *    MAXLOCALS = 1
         */
    }

    private static Double getDouble2() {
        Double test =null;
        System.out.println(test !=null);
        /**
         *    L4
         *    LINENUMBER 27 L4
         *    ALOAD 0
         *    IFNULL L5
         *    ALOAD 0
         *    INVOKEVIRTUAL java/lang/Double.doubleValue ()D               // test拆箱應對Math.abs(double)
         *    INVOKESTATIC java/lang/Math.abs (D)D                         // 執行Math.abs
         *    INVOKESTATIC java/lang/Double.valueOf (D)Ljava/lang/Double;  // Math.abs的返回值double裝箱,應對三目運算符返回類型Double
         *    GOTO L6
         *    L5
         *    FRAME SAME
         *    ALOAD 0
         */
        return test !=null ? (Double)Math.abs(test) : test;
        /**
         *    L6
         *    FRAME SAME1 java/lang/Double                                 // 不再對三目double的返回值裝箱,因爲三目返回類型為Double,與方法返回類型一致
         *    ARETURN
         *    L7
         *    LOCALVARIABLE test Ljava/lang/Double; L1 L7 0                // 方法返回
         *    MAXSTACK = 2
         *    MAXLOCALS = 1
         */
    }
}

 

三目运算符与字节码阅读

原文:https://www.cnblogs.com/silyvin/p/14687420.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!