gpt4 book ai didi

Java JVM 热交换行为

转载 作者:行者123 更新时间:2023-12-01 05:22:49 27 4
gpt4 key购买 nike

我今天尝试了 Javas Hotswap,它运行得很好。在我的测试过程中,我偶然发现了一种相当奇怪的行为。这是我的代码:

public class Test extends JFrame implements ActionListener{

private JButton c;
private int f =1;
/**
* @param args
*/
public static void main(String[] args) {
Test t = new Test();
}

public Test(){
this.setPreferredSize(new Dimension(800, 600));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
c = new JButton("Click");
c.addActionListener(this);
this.add(c);
this.pack();
this.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
c.setText(String.valueOf(f++));

}

}

请注意末尾处的行 c.setText(String.valueOf(f++)); 。如果我在程序运行时将其切换为 f-- ,我会注意到更改后第一次单击按钮时,该值仍在累加。然而,此后的点击次数计数正确。将其改回来时也会发生同样的情况。

我注意到的下一件事是:如果我将代码更改为:c.setText(String.valueOf(f+=1));,运行 JVM 并将其热交换到 c.setText(String.valueOf(f-=1)); 直接应用更改,没有点击延迟。

我现在的问题是:到底是什么导致了这种行为? f++f+=1 在 JVM 代码级别上有什么区别?

最佳答案

在此代码上使用 javap:

public static void main(String[] args) throws Exception {
int i = 0;
i++;
System.out.println(i);
i+=1;
System.out.println(i);
}

返回

  0: iconst_0
1: istore_1
2: iinc 1, 1
5: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
12: iinc 1, 1
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_1
19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
22: return

==>没有区别

关于Java JVM 热交换行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com