java – 使用Asm字节码生成器(ClassWriter)生成通用类型的方法
发布时间:2020-12-14 05:04:58 所属栏目:Java 来源:网络整理
导读:定义简单的getter和setter是很容易的使用Asm(幸运的是,甚至在他们的常见问题解答).但是有一件事没有提及,为此我无法找到文档,是如何使用泛型类型信息来实现的. 我实际上很容易确定通用类型信息本身(因为代码将采用现有的字段和/或方法,并且存在完整的通用类
定义简单的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;" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读