Java OW2 ASM使用接口访问字节码类

时间:2011-09-07 14:11:15

标签: java bytecode java-bytecode-asm

我一直在尝试在网上搜索指南/帮助,通过在ASM中将字节代码类转换为接口的接口来访问字节代码类。 我已经在RuneScape bot上看到了这个名为powerbot(RSBot)的源代码我也是从https://github.com/powerbot/RSBot获得的,但我无法理解它是如何完成的,因为我在将类转换为包含“骨架”的接口时遇到类转换异常“每一种方法......我知道你必须愚蠢地认为你可以将一个类转换为接口.. 我知道必须有一些准备工作,但是在ASM书籍/电子书(http://download.forge.objectweb.org/asm/asm-guide.pdf)中,就我的内容而言,没有任何关于它的内容。我对此非常感兴趣,不是为了制作一个新的RS机器人,而是为了学习这个很酷的库来代替BCEL满足我的需求。我会给你一个快速的例子来更好地理解这个问题!

这里有一个名为“helloSO”的课程

public class helloSO {

    public void doSomething(){
        System.out.println("I did something! :D");
    }

}

这里我有一个名为“helloSO”的界面

public interface helloSO {

    public void doSomething();

}

我希望能够将我读取的.class和使用ASM定义到类的接口,以便能够使用它们的名称从该实例调用方法。我希望我能解释这一点。如果你想要,你可以查看RSBot,看看我的意思更好。 :)所以我要问的是;我必须做些什么准备,在哪里可以了解它们?我不是要求你创建我的类适配器或任何只是建议和帮助:) 提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的类已包含匹配方法,则使用ClassAdapter添加接口实际上非常简单。您只需要覆盖visit方法,该方法将传递一个接口名称数组,并在委托给超级实现之前添加另一个接口:

@Override
public void visit(final int version, final int access, final String classname, final String signature, final String superName, final String[] interfaces) {
    Set<String> newinterfaces = new HashSet<String>(Arrays.asList(interfaces));
    newinterfaces.add(helloSO.class.getName().replace('.', '/'));
    super.visit(version, access, classname, signature, superName, newinterfaces.toArray(new String[newinterfaces.size()]));
}

如果类已经实现了新接口,我在这里使用Set作为接口。接口使用其内部名称命名,这意味着包名称中的点将被斜杠替换。