[英]Generating methods with generic types with Asm bytecode generator (ClassWriter)
使用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;"
根据我的经验,大多数动态字节码生成库对泛型类型没有很好的支持; 但是擦除的类工作得很好(当然,除非你想在以后内省这些类)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.