0

我一直在尝试在网络上搜索指南/帮助,以通过在 ASM 中将字节码类转换为的接口访问字节码类。我已经在名为 powerbot (RSBot) 的 RuneScape 机器人上看到了这一点,我也从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 以更好地了解我的意思。:) 所以我要问的是;我必须做哪些准备工作以及在哪里可以了解这些准备工作?我不是要您为我创建类适配器或任何建议和帮助:) 提前致谢!

4

1 回答 1

0

如果您的类已经包含匹配的方法,那么使用 a 添加接口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这里使用接口。接口使用它们的内部名称命名,这仅意味着包名称中的点被斜杠替换。

于 2011-12-07T15:04:55.107 回答