13

使用 Asm 定义简单的 getter 和 setter 很容易(幸运的是,它甚至在他们的 FAQ 中有解释)。但是没有提到的一件事,我一直找不到文档,就是如何使用泛型类型信息来实现这些。

我实际上能够很容易地确定泛型类型信息本身(因为代码将采用现有的字段和/或方法,并且存在完整的泛型类型处理和解析)。我只需要为包含泛型类型的类型生成泛型版本。

我希望这与修改签名 Asm ClassWriter/MethodVisitor 调用一样简单,但文档中的一些评论表明它可能并不那么容易(因为泛型信息存储在与常规信息不同的位置)。

编辑:看起来入口点是“ClassWriter.visitField/Method(...., String signature) - 请注意,它是包含普通非泛型类信息的“描述”,但术语“签名”(在 JLS 中)专门指到泛型——包括类型信息。

4

2 回答 2

9

SignatureWriter您可以使用 ASM 的类构建签名。

例如,假设您希望为此方法编写签名:

public <K> void doSomething(K thing)

您可以使用以下代码:

SignatureWriter signature = new SignatureWriter();
signature.visitFormalTypeParameter("K");

// Ensure that <K> extends java.lang.Object
{
    SignatureVisitor classBound = signature.visitClassBound();
    classBound.visitClassType(Type.getInternalName(Object.class));
    classBound.visitEnd();
}

// The parameter uses the <K> type variable
signature.visitParameterType().visitTypeVariable("K");

// The return type uses the void primitive ('V')
signature.visitReturnType().visitBaseType('V');

signature.visitEnd();

String signatureString = signature.toString();

这相当于:

String signatureString = "<K:Ljava/lang/Object;>(TK;)V;"
于 2010-07-29T17:24:21.403 回答
-2

以我的经验,大多数即时字节码生成库对泛型类型都没有很好的支持。但是擦除的类工作得很好(当然,除非你以后想反省这些类)。

于 2010-07-26T08:43:12.693 回答