使用 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
.
例如:
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
您可以使用 javap 查看 javac 如何编译这个 class。对于您的签名,该值为:
Ljava/lang/Object;Ljava/util/function/Supplier<Ljava/lang/String;>;
作为第一个参数,您需要提供非泛型超级 class,然后再提供泛型值。这作为现在的参数 null
,表示非泛型 class,跳过属性。
请注意,泛型方法需要桥接方法才能发挥作用。您需要实现 Object get()
和 String get()
并简单地从第一个方法委托给第二个方法。将第一个方法标记为合成方法并 ACC_BRIDGE
.