2016-04-21 38 views
0

這是一段代碼來調用的MouseEvent我想與Java反射調用:如何使用反射

private void cardSlotMouseClicked(MouseEvent mouseEvent) { 
    // Some stuff 

} 

這裏是班上ATM調用它的代碼:

// cardSlot is a JPanel 

    this.cardSlot.addMouseListener(new MouseAdapter(){ 

     @Override 
     public void mouseClicked(MouseEvent mouseEvent) { 
      ATM.this.cardSlotMouseClicked(mouseEvent); 
     } 
    }); 

這是我的代碼:

Class a = ATM.class; 

    Method m = a.getDeclaredMethod("cardSlotMouseClicked", MouseEvent.class); 


    m.setAccessible(true); 

    Object o = a.newInstance(); 

    m.invoke(o, "?"); // What is the argument? 

我試過MouseEvent.BUTTON1,但它不起作用。

回答

0

您需要一個MouseEvent類型的對象來傳遞給此invoke方法。要麼你可以使用生成的MouseEvent系統(通過鼠標點擊創建),也可以通過使用任何MouseEvent構造

在你的情況下創建一個虛擬鼠標事件,你可以調用所需的方法與這樣的反思:

this.cardSlot.addMouseListener(new MouseAdapter(){ 

    @Override 
    public void mouseClicked(MouseEvent mouseEvent) { 
     Class a = ATM.class; 

     Method m = a.getDeclaredMethod("cardSlotMouseClicked", MouseEvent.class); 


     m.setAccessible(true); 

     Object o = a.newInstance(); 

     m.invoke(o, mouseEvent); 
    } 
}); 
+0

有沒有辦法告訴JPanel執行操作,因爲MouseAdapter是由JPanel調用的? – user6212007

+0

無論你將添加此鼠標適配器,只要在該組件上單擊鼠標,它將被調用 – Sanjeev

+0

我正在嘗試模擬黑客。鏈接到ATM:https://codepad.co/snippet/yjATRN3S,卡片:https://codepad.co/snippet/Z0zZfNhW – user6212007