Java OW2 ASM, использующий интерфейс для доступа к классу байт-кода - PullRequest
0 голосов
/ 07 сентября 2011

Я пытался искать в Интернете руководства / справки для доступа к классам байт-кода через интерфейс, к которому класс байт-кода преобразуется в ASM.Я видел, как это делается на боте RuneScape под названием 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();

}

Я хотел бы иметь возможность разыграть.класс, который я читаю и определяю для класса с ASM для этого интерфейса, чтобы иметь возможность вызывать методы из этого экземпляра с их именами. Надеюсь, я объяснил это достаточно хорошо. Если хотите, вы можетеck RSBot, чтобы лучше понять, что я имею в виду.:) Так что я спрашиваю, это;какие приготовления я должен сделать и где я могу узнать о них?Я не прошу вас создать мне адаптер класса или что-нибудь, просто совет и помощь :) Заранее спасибо!

1 Ответ

0 голосов
/ 07 декабря 2011

Добавление интерфейса с использованием 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 для интерфейсовв случае, если класс уже реализует новый интерфейс.Интерфейсы именуются с использованием их внутренних имен, что означает, что точки в имени пакета заменяются косыми чертами.

...