【问题标题】:Java OW2 ASM using interface to access byte code classJava OW2 ASM使用接口访问字节码类
【发布时间】:2011-09-07 14:11:15
【问题描述】:

我一直在尝试在网络上搜索指南/帮助,以通过在 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 以更好地了解我的意思。 :) 所以我要问的是;我必须做哪些准备工作以及在哪里可以了解这些准备工作?我不是要你为我创建类适配器或任何建议和帮助:) 提前致谢!

【问题讨论】:

    标签: java bytecode java-bytecode-asm


    【解决方案1】:

    如果您的类已经包含匹配方法,则使用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 作为接口,以防类已经实现了新接口。接口使用它们的内部名称命名,这只是意味着包名称中的点被斜线替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多