定义简单的getter和setter很容易使用Asm (幸运的是,它甚至在他们的FAQ中得到了解释)。但是,有一件事没有提到,而且我一直找不到文档,就是如何使用泛型类型信息来实现这些文档。
实际上,我能够很容易地确定泛型类型信息本身(因为代码将采用现有的字段和/或方法,并且存在完整的泛型类型处理和解析)。我只需要为包含泛型类型的类型生成泛型版本。
我希望这可以像修改签名Asm ClassWriter/MethodVisitor调用一样简单,但文档中的一些注释表明这并不容易(因为泛型信息存储在与常规信息略有不同的位置)。
编辑:看起来入口点是“ClassWriter.visitField/Method”(.,String签名) --注意包含普通非泛型类信息的是"description“,但是术语"signature”(在JLS中)具体指泛型--包括类型信息。
发布于 2010-07-29 09:24:21
您可以使用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;"
发布于 2010-07-26 00:43:12
根据我的经验,大多数运行中的字节码生成库对泛型类型没有很好的支持;但是擦除的类工作得很好(当然,除非您以后想对这些类进行反思)。
https://stackoverflow.com/questions/3250701
复制相似问题