簡體   English   中英

使用Asm字節碼生成器生成具有泛型類型的方法(ClassWriter)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM