使用 asm 如何声明非泛型 class 实现泛型接口

With asm how to declare a non-generic class implements generic interface

例如:

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/Supplier

java/util/function/Supplier

java/util/function/Supplier

java/util/function/Supplier

java/util/function/Supplier

您可以使用 javap 查看 javac 如何编译这个 class。对于您的签名,该值为:

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

作为第一个参数,您需要提供非泛型超级 class,然后再提供泛型值。这作为现在的参数 null,表示非泛型 class,跳过属性。

请注意,泛型方法需要桥接方法才能发挥作用。您需要实现 Object get()String get() 并简单地从第一个方法委托给第二个方法。将第一个方法标记为合成方法并 ACC_BRIDGE.