代码之家  ›  专栏  ›  技术社区  ›  StaxMan

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

  •  13
  • StaxMan  · 技术社区  · 16 年前

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

    我希望这和修改签名Asm ClassWriter/MethodVisitor调用一样简单,但是文档中的一些注释表明这可能没有那么容易(因为泛型信息存储在与常规信息稍有不同的位置)。

    编辑 :看起来入口点是“ClassWriter.visitField/Method(…..,String signature)--请注意,它是“description”,包含普通的非泛型类信息,但术语“signature”(在JLS中)特别指包含类型信息的泛型。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Adam Paynter    16 年前

    您可以使用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;"
    
        2
  •  -2
  •   Tassos Bassoukos    16 年前

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