С помощью asm как объявлять не * generi c класс реализует интерфейс generi c - PullRequest
0 голосов
/ 27 апреля 2020

Например:

class A implements Supplier<String> {

    String get(){
        ....
    }
}

Я использую этот код, но не получилось:

classWriter.visit(
                V1_8,
                ACC_PUBLIC,
                "abc/A",
                null,
                parentName,
                new String[]{"java/util/function/Supplier"}
        );

Все эти объявления интерфейса не выполнены:

java / util / function / Поставщик

Java / утилита / функция / поставщик

Java / утилита / функция / поставщик

Java / утилита / функция / поставщик

Java / Util / функция / Поставщик

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете использовать javap , чтобы посмотреть, как javac скомпилирует этот класс. Для вашей подписи значение будет:

Ljava/lang/Object;Ljava/util/function/Supplier<Ljava/lang/String;>;

. В качестве первого аргумента вам необходимо указать суперкласс non-generi c, а затем после значений c generi. Это аргумент, который теперь равен null, что указывает на класс non-generi c, пропускающий атрибут.

Обратите внимание, что методы generi c требуют для работы методов-мостов. Вам нужно будет реализовать оба Object get() и String get() и просто делегировать от первого метода ко второму. Отметьте первый метод как syntheti c и ACC_BRIDGE.

...