2012-04-10 53 views
0

今天我嘗試了Java Hotswap,它的工作相當不錯。在我的測試中,我偶然發現了一個相當奇怪的行爲。這是我的代碼:Java JVM 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));直接應用更改,而不會發生點擊延遲。

我現在的問題是:究竟是什麼導致了這種行爲? JVM代碼級別上的f++f+=1之間有什麼區別?

+0

可能的重複[優先級的++和 - 運營商在Java](http://stackoverflow.com/questions/6373976/precedence-of-and-operators-in-java)...和運營商在一般。 – 2012-04-10 15:55:56

+0

我認爲這是一個不同的問題,因爲焦點更多的是熱切換JVM的行爲,而不是操作符優先級。 – 2012-04-10 16:01:20

回答

0

在此代碼中使用的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 

==>沒有區別

+0

我用'++ f'混淆了'f ++',我的不好,但是這回答了我的一半問題 – Simiil 2012-04-10 16:01:35

0

你關掉所有的優化?有quite a few不同tricksJIT compiler可以動態地在幕後做,所以underlying code在執行期間改變multiple times

使用actionPerformed()您正在處理異步事件,即使沒有熱交換問題,也可能會使執行路徑變得更加困難。

做同樣的測試代碼

c.setText(String.valueOf(f++)); 

,但做一個大循環設置了斷點裏面,這樣你可以用更少的運動部件測試出的變化。