我正在写一个游戏引擎/库,其中我有一个事件调度程序类,它通过调用“已注册”事件处理程序类的侦听器方法来调度事件。可以通过调用适当的调度程序方法向事件调度程序注册事件处理程序/侦听程序。将代码添加到具有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