java - 使用 Asm 字节码生成器 (ClassWriter) 生成具有泛型类型的方法

标签 java generics code-generation bytecode java-bytecode-asm

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

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

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

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

最佳答案

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

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

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;"

关于java - 使用 Asm 字节码生成器 (ClassWriter) 生成具有泛型类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250701/

相关文章:

java - Java 中的 Hello World 无法编译

java - 在 Hibernate 中使用 "ON clause"获取连接的替代方法

java - 如何从谷歌搜索中获取前 5 个链接的列表?

swift - swift 的通用下标

c# - 将 XML 字符串转换为 List<T> 而无需在 C# 中指定元素根

java - Xtext 没有从我的 dsl 生成完整的类

Java:适合初学者的 Struts2 和 IntelliJ

c# - 列表 <BusinessObject> 还是 BusinessObjectCollection?

c# - 如何从 .t​​t 文件(T4 模板)的 web.config 中读取 appSetting

c# - 有没有办法从 SQL 表或查询生成对象初始值设定项?