我今天尝试了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,然后将其Hotswap替换为c.setText(String.valueOf(f-=1));,更改将直接应用,没有单击延迟。

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

最佳答案

在此代码上使用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


==>没有区别

10-01 19:14