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

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

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

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

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

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

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

 public  void doSomething(K thing) 

你可以使用这段代码:

 SignatureWriter signature = new SignatureWriter(); signature.visitFormalTypeParameter("K"); // Ensure that  extends java.lang.Object { SignatureVisitor classBound = signature.visitClassBound(); classBound.visitClassType(Type.getInternalName(Object.class)); classBound.visitEnd(); } // The parameter uses the  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 = "(TK;)V;" 

根据我的经验,大多数动态字节码生成库对generics类型没有很好的支持; 但是擦除的类工作得很好(当然,除非你想在以后内省这些类)。