微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使用Asm字节码生成器(ClassWriter)生成通用类型的方法

定义简单的getter和setter是很容易的使用Asm(幸运的是,甚至在他们的常见问题解答).但是有一件事没有提及,为此我无法找到文档,是如何使用泛型类型信息来实现的.

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

我希望这可以像修改签名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;"

原文地址:https://www.jb51.cc/java/123551.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐