ASM:查找通用类型的描述符
ASM: find descriptor of a generic type
我正在创建一个基于 ASM 的实用程序来动态生成 class。我需要做的一件事是生成一个将泛型类型作为参数的方法签名。例如
public void setValue(List<String> value) {...}
问题是如何使用 ASM 库获取 List<String>
的描述符。我知道有一个实用方法 asm.Type.getDescriptor(Class)
,我想知道是否有类似 getDescriptor(java.lang.reflect.Type)
的东西,或者我该如何实现它?
谢谢...格林
好的,仅供需要的人使用,这是我的 implementation:
private static String typeDesc(BeanSpec spec) {
String root = classDesc(spec.rawType());
List<java.lang.reflect.Type> typeParams = spec.typeParams();
if (typeParams.isEmpty()) {
return root;
}
StringBuilder sb = S.builder("<");
for (java.lang.reflect.Type type : typeParams) {
BeanSpec specx = BeanSpec.of(type, null, spec.injector());
sb.append(typeDesc(specx));
}
sb.append(">");
FastStr str = FastStr.of(root);
str = str.take(str.length() - 1).append(sb.toString()).append(";");
return str.toString();
}
private static String classDesc(Class c) {
if (c.isPrimitive()) {
c = $.wrapperClassOf(c);
}
return Type.getDescriptor(c);
}
您正在寻找签名,而不是描述符。描述符总是引用原始类型。
对于 ASM,您通常会为此目的使用 a SignatureVisitor
。对于您的示例,您可以通过以下方式为 void : List<String>
创建签名:
SignatureVisitor sv = new SignatureWriter();
SignatureVisitor psv = sv.visitParameterType();
psv.visitClassType(Type.getInternalName(List.class));
SignatureVisitor ppsv = psv.visitTypeArgument('=');
ppsv.visitClassType(Type.getInternalName(String.class));
psv.visitEnd();
SignatureVisitor rtv = sv.visitReturnType();
rtv.visitBaseType('V');
String signature = sv.toString();
由于调用 visitEnd
的条件要求,签名访问者 API 与其他访问者 API 一样直观,但阅读 javadoc 可以了解其中的含义。
我正在创建一个基于 ASM 的实用程序来动态生成 class。我需要做的一件事是生成一个将泛型类型作为参数的方法签名。例如
public void setValue(List<String> value) {...}
问题是如何使用 ASM 库获取 List<String>
的描述符。我知道有一个实用方法 asm.Type.getDescriptor(Class)
,我想知道是否有类似 getDescriptor(java.lang.reflect.Type)
的东西,或者我该如何实现它?
谢谢...格林
好的,仅供需要的人使用,这是我的 implementation:
private static String typeDesc(BeanSpec spec) {
String root = classDesc(spec.rawType());
List<java.lang.reflect.Type> typeParams = spec.typeParams();
if (typeParams.isEmpty()) {
return root;
}
StringBuilder sb = S.builder("<");
for (java.lang.reflect.Type type : typeParams) {
BeanSpec specx = BeanSpec.of(type, null, spec.injector());
sb.append(typeDesc(specx));
}
sb.append(">");
FastStr str = FastStr.of(root);
str = str.take(str.length() - 1).append(sb.toString()).append(";");
return str.toString();
}
private static String classDesc(Class c) {
if (c.isPrimitive()) {
c = $.wrapperClassOf(c);
}
return Type.getDescriptor(c);
}
您正在寻找签名,而不是描述符。描述符总是引用原始类型。
对于 ASM,您通常会为此目的使用 a SignatureVisitor
。对于您的示例,您可以通过以下方式为 void : List<String>
创建签名:
SignatureVisitor sv = new SignatureWriter();
SignatureVisitor psv = sv.visitParameterType();
psv.visitClassType(Type.getInternalName(List.class));
SignatureVisitor ppsv = psv.visitTypeArgument('=');
ppsv.visitClassType(Type.getInternalName(String.class));
psv.visitEnd();
SignatureVisitor rtv = sv.visitReturnType();
rtv.visitBaseType('V');
String signature = sv.toString();
由于调用 visitEnd
的条件要求,签名访问者 API 与其他访问者 API 一样直观,但阅读 javadoc 可以了解其中的含义。