0

ASMでバイトコードクラスがキャストされているインターフェースを介してバイトコードクラスにアクセスするためのガイド/ヘルプをWebで検索しようとしています。これは、 https://github.com/powerbot/RSBotからソースを取得した powerbot (RSBot) と呼ばれる RuneScape ボットで行われているのを見てきました。しかし、すべてのメソッドの「スケルトン」を含むインターフェイスにクラスをキャストするときにクラスキャスト例外が発生するため、それがどのように行われるのか理解できません.クラスをインターフェイスにキャストできるように考えるのは愚かなことだと思います..私はいくつかの準備が必要であることを知っていますが、ASM book/ebook (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

クラスにすでに一致するメソッドが含まれている場合、を使用してインターフェースを追加するの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 に答える