我正在寫一個遊戲引擎/庫,其中我有一個事件調度程序類,它通過調用「已註冊」事件處理程序類的偵聽器方法來調度事件。可以通過調用適當的調度程序方法向事件調度程序註冊事件處理程序/偵聽程序。將代碼添加到具有Instrumentation的Java類:ASM或BCEL?
這顯然會導致註冊每個事件處理程序的一些樣板代碼(以及我的引擎的其他方面都有類似的bolierplate代碼),所以我想知道 - 如何使用Instrumentation在加載期間添加所有必需的代碼的事件處理程序類,因此編碼時不需要顯式註冊與事件分派器 - 當程序運行時,調度程序的註冊方法調用會自動添加。
我的理解是,爲了使用Instrumentation,應該使用一些字節碼修飾符API。我知道兩個 - ASM和BCEL。我應該使用哪一個?顯然,這是一個我想要做的簡單任務,所以我想要一個更容易學習和更好記錄的任務。
編輯:這裏是一個具體的例子。
原始事件處理類:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
改造後:
@Handler
public class MouseEventHandler implements EventHandler<MouseEvent>
{
public MouseEventHandler()
{
//add this line of code to default constructor
Game.getEventDispatcher().addEventHandler(this);
}
public void handleEvent(MouseEvent event)
{ ... }
}
bcel已經包含到JDK – 2013-07-09 06:53:07
@ alexander.box:是的,作爲XSLTC變壓器Xalan的依賴項,但它是非標準的API,也隱藏在包com.sun.org.apache.bcel.internal !更好地提供你自己的罐子。 – Daniel 2014-07-08 08:25:47
哦,雖然我在這上面:當班級必須裝備時,ASM是一個非常好的選擇。易於理解和使用。還有一個非常好的文檔。 – Daniel 2014-07-08 08:26:16